Botan AutoSeeded_RNG 无法初始化,未知引用,尽管库已正确链接
Botan AutoSeeded_RNG can not be initialized, unknown reference, although libs are correctly linked
我只是尝试初始化 Botan AutoSeeded_RNG 但由于引用错误而失败。我只是想测试我是否可以初始化任何类型的 botan RNG,实际上我在另一个项目中遇到了麻烦。
我有正确的 header 包括在内并且正在链接到 Botan 的库,因此我不知道,为什么它找不到 referende。
这是我的代码:
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
我做错了什么?
谢谢你提前的建议。
你不是 link反对 botan 图书馆。 -L <dir>
标志仅将目录添加到库搜索路径,它不会告诉 g++
到 link 针对任何特定库。要针对库 link,您必须使用 -l <lib>
参数。 linker 然后将在其库搜索路径中搜索该库,包括通过 -L <dir>
.
传递的目录
要link针对botan库,你要找到包含botan库的目录。我了解您的情况是 /usr/local/lib/libbotan-2.so
。然后,您可以将 -lbotan-2
参数添加到 g++
参数列表中。这将使 g++
在其库搜索路径中查找名为 libbotan-2.so
的库。由于您使用 -L /usr/local/lib
参数将 /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 库的 linker 标志。我们可以手动将它们复制到 g++ 参数列表,或者使用以下命令自动传递它们:
g++ $(PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pkg-config --libs --cflags botan-2) my_program.cpp
我只是尝试初始化 Botan AutoSeeded_RNG 但由于引用错误而失败。我只是想测试我是否可以初始化任何类型的 botan RNG,实际上我在另一个项目中遇到了麻烦。
我有正确的 header 包括在内并且正在链接到 Botan 的库,因此我不知道,为什么它找不到 referende。
这是我的代码:
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
我做错了什么?
谢谢你提前的建议。
你不是 link反对 botan 图书馆。 -L <dir>
标志仅将目录添加到库搜索路径,它不会告诉 g++
到 link 针对任何特定库。要针对库 link,您必须使用 -l <lib>
参数。 linker 然后将在其库搜索路径中搜索该库,包括通过 -L <dir>
.
要link针对botan库,你要找到包含botan库的目录。我了解您的情况是 /usr/local/lib/libbotan-2.so
。然后,您可以将 -lbotan-2
参数添加到 g++
参数列表中。这将使 g++
在其库搜索路径中查找名为 libbotan-2.so
的库。由于您使用 -L /usr/local/lib
参数将 /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 库的 linker 标志。我们可以手动将它们复制到 g++ 参数列表,或者使用以下命令自动传递它们:
g++ $(PKG_CONFIG_PATH=/some/path:$PKG_CONFIG_PATH pkg-config --libs --cflags botan-2) my_program.cpp