我最近将libcurl依赖项添加到我的c ++库中。我静态编译了libcurl with-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,这是一个大问题。
静态库只是目标文件的存档。结果之一是,它们不携带任何依赖项信息。因此,如果您链接依赖于其他一些库的静态库,则必须在链接命令中显式添加这些库。
在您的情况下,这意味着:
- 找到定义
CERT_GetDefaultCertDB@@NSS_3.2
的人 - 此常见问题解答的一些答案可能会有所帮助 - 将此库添加到链接器命令中(在静态库之后使用
-l
(