C++ 编译C和C++;使用单个makefile
我正在尝试创建一个使用my的可执行文件,其中包括openSSL静态库。所以我使用了我用来创建这个库的同一个Makefile,并对它进行了黑客攻击,使它在这里工作。这就是它的样子C++ 编译C和C++;使用单个makefile,c++,c,makefile,linker,mixed-mode,C++,C,Makefile,Linker,Mixed Mode,我正在尝试创建一个使用my的可执行文件,其中包括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
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)
所以我想制作一个静态库,它将在内部链接(或者更确切地说是合并)libssl.a
。并创建了一个静态的libAPP.a
。但我还是不断地犯这些错误
我最后在这个makefile中添加了libssl.a
和libcrypto.a
,瞧,很多错误都被修复了。我仍然有一些与dlopen
和pthreads相关的错误,所以我也添加了这些错误。我还使用CXX编译器编译所有内容,以消除由于名称混乱而导致的问题
现在让我感到困扰的是,SSL相关符号应该已经存在于libAPP.a
中(尽管nm
报告它们未定义,这本身可能需要另一个问题:D)。但是我仍然需要在这里指定libSSL.a
和libcrypto.a
,以便链接器找到它们!那么,创建存档(libAPP.a
)而不是共享库(libAPP.So
)有什么好处呢
最后,在链接阶段,我的链接器找不到lz
/usr/bin/ld: cannot find -lz
只是为了见鬼,我尝试将相同的标志添加到创建该归档文件的makefile中,并且找到它没有问题。有什么建议吗?我会在以下步骤中完成:
-d
、-p
和-n
查看它的想法。也许还有更有用的选择<>最明显的问题是,当你的程序包含C++组件时,你使用<代码> $(link .c)< /C>链接,所以你没有得到任何C++库或类似的东西。尝试使用<代码>(链接.c)<代码> $[链接(c])>代码> > $(link .CPP)< /> >或>代码> $(link .cxx)< /C>(在C++版本中,您需要的版本不同,但至少其中一个应该是预先定义的)。< / GnuMake的手册有一些启发性的章节。当然,我确信。但是,作为一个生产环境,我希望您理解我的时间相当短(这几天开发人员不是:)。如果您有一个快速修复,或者可以指出其中的一个明显缺陷,或者建议一个更简单的方法来处理类似的事情,我将不胜感激@顺便说一句,当我放松的时候,我一定会去看看那些章节,希望学习一些新的东西。你应该明白的第一件事是,你的问题不是make或makefile。如果出现链接错误,这意味着问题在于编译或链接命令错误。因此,试图将其归咎于make或makefile不会有任何效果。如果您不熟悉如何将编译器和链接器与共享库一起使用,那么一个有用的练习是尝试在shell提示符下直接运行compile命令,直到找到正确的命令。然后,你可以担心如何将它们放入你的MaCube文件中。最有效的方法是:“代码> > CXXFLAGG/<代码>是C++编译器的标志,而
$(LINK.cpp)
--或者其他方法之一,若在您使用的make版本中并没有定义的话。make会直接推断出{LINK.cpp},还是需要显式定义它?另外,我是否可以链接所有对象,而不管它们的源是什么(C/C++)??
/usr/bin/ld: cannot find -lz