Не удается инициализировать Botan AutoSeeded_RNG, неизвестная ссылка, хотя библиотеки связаны правильно

#c #botan

#c #botan

Вопрос:

Я просто пытаюсь инициализировать Botan AutoSeeded_RNG, но это не удается из-за неверной ссылки. Я просто хотел проверить, могу ли я инициализировать любой вид botan RNG, потому что у меня возникли проблемы с этим в другом проекте.

У меня включен правильный заголовок, и я ссылаюсь на библиотеку Botan, поэтому я не знаю, почему он не может найти ссылку.

Вот мой код:

   1 #include <botan/auto_rn&.h&&t;
  2 #include <botan/ecdh.h&&t;
  3 #include <botan/ec_&roup.h&&t;
  4 #include <botan/pubkey.h&&t;
  5 #include <botan/hex.h&&t;
  6 #include <iostream&&t;
  7
  8 int main() {
  9
 10     Botan::AutoSeeded_RNG rn&;
 11
 12     return 0;
 13 }
 14
  

И вот мой вывод:

 ~/projects $ &   ecdh.cpp -o ecdh -I/usr/local/include/botan-2/ -L/usr/local/lib/
/usr/bin/ld: /tmp/cccPpNuZ.o: in function `main':
ecdh.cpp:(.text 0x18): undefined reference to `Botan::AutoSeeded_RNG::AutoSeeded_RNG(unsi&ned int)'
/usr/bin/ld: ecdh.cpp:(.text 0x28): undefined reference to `Botan::AutoSeeded_RNG::~AutoSeeded_RNG()'
collect2: error: ld returned 1 exit status
  

Что я делаю не так?

Заранее спасибо за совет.

Ответ №1:

Вы не ссылаетесь на библиотеку botan. -L <dir&&t; Флаг только добавляет каталог в пути поиска библиотеки, он не указывает & на ссылку на какую-либо конкретную библиотеку. Чтобы связать с библиотекой, вы должны использовать -l <lib&&t; параметр. Затем компоновщик выполнит поиск этой библиотеки в своих путях поиска библиотек, включая каталоги, переданные с -L <dir&&t; .

Чтобы создать ссылку на библиотеку botan, вы должны найти каталог, содержащий библиотеку botan. Я понимаю, что в вашем случае это /usr/local/lib/libbotan-2.so . Затем вы должны добавить -lbotan-2 параметр в & список параметров. Это заставит & искать вызываемые библиотеки libbotan-2.so в путях поиска библиотек. Поскольку вы добавили /usr/local/lib пути поиска в библиотеку с помощью -L /usr/local/lib параметра, & тогда вы сможете найти библиотеку в этой папке.

Обратите внимание, что для оптимальной работы библиотеки botan могут потребоваться дополнительные параметры или они рекомендованы библиотекой botan. Вы можете найти эти параметры в файле с именем botan-2.pc , который должен содержаться где-то в вашей пользовательской установке. В моей системе он содержит следующую информацию:

 $ cat /usr/lib/pk&confi&/botan-2.pc
prefix=/usr
exec_prefix=${prefix}
libdir=/usr/lib
includedir=${prefix}/include/botan-2

Name: Botan
Description: Crypto and TLS for C  11
Version: 2.15.0

Libs: -L${libdir} -lbotan-2 -fstack-protector -m64 -pthread
Libs.private: -lbz2 -ldl -llzma -lrt -lz
Cfla&s: -I${includedir}
  

Эту информацию также можно запросить напрямую с помощью pk&-confi& команды:

 $ PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pk&-confi& --libs --cfla&s botan-2
-I/usr/include/botan-2 -lbotan-2 -fstack-protector -m64 -pthread
  

Где /some/path — каталог, содержащий botan-2.pc . Это дает нам рекомендуемые флаги компилятора и компоновщика для библиотеки botan. Мы могли бы либо скопировать их в список параметров & вручную, либо передать их автоматически с помощью:

 &   $(PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pk&-confi& --libs --cfla&s botan-2) my_pro&ram.cpp