我只是尝试初始化Botan AutoSeeded_RNG,但由于引用错误而失败。我只是想测试一下是否可以初始化任何种类的Botan RNG,因为我在另一个项目中遇到了麻烦。
我包含正确的 header ,并且正在链接到Botan的lib,因此我不知道为什么它找不到裁判。
这是我的代码:

  1 #include <botan/auto_rng.h>
  2 #include <botan/ecdh.h>
  3 #include <botan/ec_group.h>
  4 #include <botan/pubkey.h>
  5 #include <botan/hex.h>
  6 #include <iostream>
  7
  8 int main() {
  9
 10     Botan::AutoSeeded_RNG rng;
 11
 12     return 0;
 13 }
 14
这是我的输出:
~/projects $ g++ 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(unsigned int)'
/usr/bin/ld: ecdh.cpp:(.text+0x28): undefined reference to `Botan::AutoSeeded_RNG::~AutoSeeded_RNG()'
collect2: error: ld returned 1 exit status
我究竟做错了什么?
谢谢您的建议。

最佳答案

您没有链接到Botan库。 -L <dir>标志仅将目录添加到库搜索路径,而不会告诉g++链接到任何特定的库。要链接到库,必须使用-l <lib>参数。然后,链接程序将在其库搜索路径中搜索该库,包括通过-L <dir>传递的目录。
要链接到Botan库,您必须找到包含Botan库的目录。我了解您的情况是/usr/local/lib/libbotan-2.so。然后,您可以将-lbotan-2参数添加到g++参数列表中。这将使g++在其库搜索路径中查找名为libbotan-2.so的库。由于您使用/usr/local/lib参数将-L /usr/local/lib添加到库搜索路径,因此g++应该能够在此文件夹中找到库。
请注意,可能需要附加参数或botan库建议使用其他参数以获得最佳体验。您可以在名为botan-2.pc的文件中找到这些参数,该文件应包含在自定义安装中的某个位置。在我的系统上,它包含以下信息:

$ cat /usr/lib/pkgconfig/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
Cflags: -I${includedir}
也可以使用pkg-config命令直接查询此信息:
$ PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pkg-config --libs --cflags botan-2
-I/usr/include/botan-2 -lbotan-2 -fstack-protector -m64 -pthread
其中/some/path是包含botan-2.pc的目录。这为我们提供了建议的botan库编译器和链接器标志。我们可以将它们手动复制到g++参数列表,也可以使用以下命令自动传递它们:
g++ $(PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pkg-config --libs --cflags botan-2) my_program.cpp

10-08 08:23