我最近将libcurl依赖项添加到了我的c ++库中。我静态编译了libcurl和-nss以支持https。我使用Debian 7进行编译。
我为我的库创建了两个版本 - 静态和共享
共享版本可以很好地与任何Linux发行版上构建的二进制文件链接,但静态构建仅在Debian 7上编译时与二进制文件链接。
我在Ubuntu 16.04,Debian Stretch上尝试过静态链接,但所有人都在编译时报告错误:
g++ -Wall -o Sample Sample.cpp -Wl,-Bstatic -L. -lMyLibrary -Wl,-Bdynamic -lssl3
/usr/bin/ld: ./libMyLibrary.a(libcurl_la-nss.o): undefined reference to symbol 'CERT_GetDefaultCertDB@@NSS_3.2'
//usr/lib/x86_64-linux-gnu/libnss3.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:22: recipe for target 'Sample' failed
make: *** [Sample] Error 1
静态编译现在只适用于Debian 7,这是一个很大的问题。
答案 0 :(得分:1)
静态库只是目标文件的归档。一个结果是,他们没有携带任何依赖信息。因此,如果链接一个依赖于其他库的静态库,则必须在链接命令中明确添加这些库。
在您的情况下,这意味着:
CERT_GetDefaultCertDB@@NSS_3.2
的人 - this FAQ的一些答案可以帮助-l
,在静态库之后)