неопределенная ссылка на символ 'CERT_GetDefaultCertDB @@ NSS_3.2' - PullRequest
0 голосов
/ 30 апреля 2018

Я недавно добавил зависимость 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 голосов
/ 30 апреля 2018

Статические библиотеки - это просто архивы объектных файлов. Как следствие, они не несут никакой информации о зависимости. Поэтому, если вы связываете статическую библиотеку, которая зависит от некоторых других библиотек, вы должны явно добавить их в команду связывания.

В вашем случае это означает:

  • найдите того, кто определит CERT_GetDefaultCertDB@@NSS_3.2 - некоторые ответы на этот FAQ могут помочь здесь
  • добавить эту библиотеку в команду компоновщика (с -l после статической библиотеки)
...