我正在使用 Qt,我正在尝试使用 Botan。一切似乎都很顺利,但是当我走的时候:
Botan::BigInt myInt;
在我的构造函数中它工作正常,但另一方面,如果我去:
Botan::AutoSeeded_RNG rng;
它抛出未定义的错误:
C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\mainwindow.o:-1: In function `AutoSeeded_RNG':
C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\..\..\..\botan\include\botan\auto_rng.h:40: error: undefined reference to `_imp___ZN5Botan23Global_State_Management12global_stateEv'
C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\..\..\..\botan\include\botan\auto_rng.h:40: error: undefined reference to `_imp___ZN5Botan13Library_State10global_rngEv'
:-1: error: collect2: ld returned 1 exit status
我不知道为什么它适用于 BigInt 而不是 AutoSeeded_RNG,但这是我的确切步骤:
编译了位于“src/libs/3rdparty/botan/”的 Qt Creator 源中包含的 Botan 源
我使用来自 their website 的 Windows Installer (1.10) 安装了 Botan .
我将 libBotan.a、libBotand.a、botan.dll 和 Botand.dll 放在我安装 Botan 的位置 (C:\botan)。我覆盖了任何已经存在的文件。
然后我创建了一个新的 Qt 项目,并在 .pro 文件中添加了以下行:
INCLUDEPATH += "C:/botan/include"
LIBS += "C:/botan/libBotan.a"接下来,我进入“mainwindow.cpp”,并添加:
#include <botan/botan.h>
一切都成功编译到这里。
我现在将它添加到我的构造函数中:
Botan::AutoSeeded_RNG rng;
现在抛出以上错误,无法运行。如果我用“BigInt”替换“AutoSeeded_RNG”,那么它可以完美编译。
感谢您的帮助,Hetelek。
最佳答案
链接到 Botan 图书馆的声明对我来说很奇怪。通常,您使用 -L
开关指定库目录并使用 -l
开关添加库,即您应该使用
LIBS += -L"C:\botan" -lBotan
注意lbotan
中没有指定库的前缀和后缀。链接器将根据您的环境自动查找 libbotan.a
或 botan.dll
。
Botan 也是 QtCreator 的一部分。也许你应该看看 their repository .您可以在那里找到 .pri
和 .pro
文件,可能只需要复制它们。他们还为新的 Qt 构建系统编写了 .qbs
驱动程序。
编辑:正如您在帖子中提到的,我刚刚从 QtCreator 源代码编译了 Botan。然后我将所有生成的库复制到我自己的目录中,我还使用了 QtCreator 附带的 botan.h
。在 Linux 上我必须添加
LIBS += -L"/dir/into/which/i/copied/botan/dlls" -LBotan -ldl
到 qmake .pro
文件。注意额外的 -ldl
否则我会得到对 dlym
、dlerror
等的 undefined reference 。我可以用 Botan::编译一个简单的例子: AutoSeeded_RNG
没有问题。
关于c++ - 在 Qt 中使用 Botan 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994803/