未定义引用符号'CERT_GetDefaultCertDB @@ NSS_3.2'

时间:2018-04-30 09:00:19

标签: c curl compiler-errors libcurl nss

我最近将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,这是一个很大的问题。

1 个答案:

答案 0 :(得分:1)

静态库只是目标文件的归档。一个结果是,他们没有携带任何依赖信息。因此,如果链接一个依赖于其他库的静态库,则必须在链接命令中明确添加这些库。

在您的情况下,这意味着:

  • 找到定义CERT_GetDefaultCertDB@@NSS_3.2的人 - this FAQ的一些答案可以帮助
  • 将此库添加到链接器命令(使用-l,在静态库之后)