#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