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

undefined reference to symbol 'CERT_GetDefaultCertDB@@NSS_3.2'

我最近将 libcurl 依赖项添加到我的 C++ 库中。我使用-nss 静态编译了 libcurl 以获得 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 上运行,这是个大问题。

静态库只是目标文件的存档。结果是,它们不携带任何依赖信息。所以,如果你 link 一个依赖于其他库的静态库,你必须在你的 linking 命令中明确添加这些库。

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

  • 找到定义 CERT_GetDefaultCertDB@@NSS_3.2 的人 -- this FAQ 的一些答案可能对您有所帮助
  • 将此库添加到您的 linker 命令中(使用 -l,在您的静态库之后)