我正在尝试创建一个使用我的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.a
。 Modified my aforementioned makefile并创建了一个静态libAPP.a
。但是我仍然不断收到这些错误。
我终于将libssl.a
和libcrypto.a
添加到了这个makefile和voila,许多错误已得到修复。我仍然有一些与dlopen
和pthreads有关的错误,因此我也添加了这些错误。我还使用CXX编译器编译了所有内容,以消除由于名称修改而引起的问题。
现在让我感到烦恼的是,libAPP.a
中应该已经存在与SSL相关的符号(尽管nm
将其报告为 undefined ,并且可能需要另外一个问题它是自己的:D)。但是我仍然需要在此处指定libSSL.a
和libcrypto.a
以便链接程序找到它们!那么创建存档(libAPP.a
)而不是共享库(libAPP.so
)有什么好处?
最后在链接阶段,我的链接器找不到lz
/usr/bin/ld: cannot find -lz
仅此而已,我尝试将相同的标志添加到创建该归档文件的makefile中,并且找到它没有问题。有什么建议吗?