使用单个makefile编译C和C ++

我正在尝试创建一个使用我的earlier created shared library,which by the way is now static的可执行文件,其中包括openSSL静态库。因此,我使用了与创建该库相同的Makefile,并对其进行了破解以使其在此处工作。看起来就是这样

LIBBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
CXX=g++
CflaGS= -Wall -g -pedantic
CPPflaGS= -Wall -g -pedantic 
RM= rm -f
.PHONY: all clean

c_src=$(shell find . -iname "*.c")
$(info source=$(c_src))

cpp_src=$(shell find . -iname "*.cpp")
$(info cppsource=$(cpp_src))

INC=-I$(LIBBASE)/include
$(info includes=$(INC))

# need to link pthread library here as well
LIB = -pthread

# aforementioned library
LIB+=-L$(LIBBASE)/lib 
LIB+= -l:libSCA.a

#need to add SSL related libraries
LIB+= -L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+= -l:libssl.a -l:libcrypto.a -static-libgcc

# As mentioned,we need to link dl and libz libraries as well
LIB+= -ldl -lz

$(info links=$(LIB))

obj=$(c_src:.c=.o) $(cpp_src:.cpp=.o)
all: APP
clean:
    $(RM) *.o APP
    $(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)

.c.o:
    ${CXX} -static ${CPPflaGS} $(INC) -c $< -o $@
    #${CC} -static ${CflaGS} $(INC) -c $< -o $@

.cpp.o:
    ${CXX} -static ${CPPflaGS} $(INC) -c $< -o $@

APP: $(obj)
    $(LINK.cxx) $^ -o $@ $(LIB)

我可以,但是无法使它正常工作。我得到了很多未定义的对我库定义的符号的引用。我已经在cpp文件中的那些符号周围使用了extern C,但似乎没有帮助。

顺便说一句,有没有比这更直接或更简单的方法了?

此外,在浏览此处的各种答案时,我遇到了这样的说法:.c.o之类的目标已经过时了,不应该再使用了。是否有针对Makefile的权威指南,该指南是最新的,详尽的实用指南(问得太多了)?

更新1:因此,在这里我可以访问日志,我注意到我得到的所有未定义的参考错误都与我静态链接到共享库的SSL库定义的符号有关。我的错误日志示例:

/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `SSL_CTX_free'
/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `X509_set_issuer_name'

因此,我想到了一个静态库,该库将在内部链接(或更确切地说合并)libssl.aModified my aforementioned makefile并创建了一个静态libAPP.a。但是我仍然不断收到这些错误。

我终于将libssl.alibcrypto.a添加到了这个makefile和voila,许多错误已得到修复。我仍然有一些与dlopenpthreads有关的错误,因此我也添加了这些错误。我还使用CXX编译器编译了所有内容,以消除由于名称修改而引起的问题。

现在让我感到烦恼的是,libAPP.a中应该已经存在与SSL相关的符号(尽管nm将其报告为 undefined ,并且可能需要另外一个问题它是自己的:D)。但是我仍然需要在此处指定libSSL.alibcrypto.a以便链接程序找到它们!那么创建存档(libAPP.a)而不是共享库(libAPP.so)有什么好处?

最后在链接阶段,我的链接器找不到lz

/usr/bin/ld: cannot find -lz

仅此而已,我尝试将相同的标志添加到创建该归档文件的makefile中,并且找到它没有问题。有什么建议吗?

coolcat006 回答:使用单个makefile编译C和C ++

我将在以下步骤中这样做:

  1. 收集所有命令以“手动”构建所有内容。只有在这种方法可行的情况下,才是初学者才有意义。这些命令可以放在批处理文件中。
  2. 提取依赖关系和规则。
  3. 将其写在Makefile中;最终,Makefile就是这样:浓缩的知识如何生成。
  4. 尝试Makefile。
  5. 如果遇到错误,我将使用make的选项-d-p-n来查看其想法。可能会有更多有用的选项。
,

最明显的问题是,当程序包含C ++组件时,您正在使用$(LINK.c)进行链接,因此没有任何C ++库或类似的库。尝试使用$(LINK.C)$(LINK.cc)$(LINK.cpp)$(LINK.cxx)(C ++所需的make版本因make版本而异,但至少应预定义其中之一。)

本文链接:https://www.f2er.com/3135932.html

大家都在问