我正在尝试在我的 Qt 应用程序中使用 Crypto++ 库。
Qt 版本为 5.3.0 VS2013 编译
在 Windows 8.1 上运行
用 VS2013 编译的 Crypto++ Lib
这是我的 .pro 文件中链接 lib 的部分
win32: LIBS += -L$$PWD/cryptopp562/Win32/DLL_Output/Release/ -lcryptopp
INCLUDEPATH += $$PWD/cryptopp562
DEPENDPATH += $$PWD/cryptopp562
一切似乎都很好。但是我有两个问题。
crypto.obj:-1: 错误: LNK2019: 未解析的外部符号 "class std::basic_string,class std::allocator > const CryptoPP::DEFAULT_CHANNEL"(?DEFAULT_CHANNEL@CryptoPP@@3V?$basic_string@DU?$char_traits@ D@std@@V?$allocator@D@2@@std@@B) 在函数“public: virtual bool __thiscall CryptoPP::Unflushable::Flush(bool,int,bool)”中引用 (?Flush@?$ Unflushable@VFilter@CryptoPP@@@CryptoPP@@UAE_N_NH0@Z)
我收到两个这样的错误,我认为这是由于两个调用 lib 的函数没有被编译。
编辑
我的观察:
win32: LIBS += -L$$PWD/cryptopp562/Win32/Output/Release/-lcryptlib
包含路径 += $$PWD/cryptopp562
依赖路径 += $$PWD/cryptopp562
win32:!win32-g++ PRE_TARGETDEPS += $$PWD/cryptopp562/Win32/Output/Release/cryptlib.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/cryptopp562/Win32/Output/Release/libcryptlib.a
我的问题是,
我犯了什么错误?
将 Crypto++ lib 链接到 Qt 项目的正确方法是什么。
最佳答案
我将在第二个块中回答编辑和评论。
After many attempts, finally I am getting this error - cryptlib.lib(cryptlib.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in main.obj
右键单击
cryptlib
项目,然后选择 属性 .请注意 运行时库 . Crypto++ 默认使用非 DLL 运行时库;我怀疑 QT 默认使用运行时库的 DLL 版本。换句话说,Crypto++ 使用
/MT
或 /MTd
默认情况下。而你需要/MD
或 /MDd
用于 Qt 集成。要解决此问题,请让 Crypto++ 为每个配置(调试和发布)和每个平台(Win32 和 x64)使用运行时库的 DLL 版本。所以你的新设置看起来像这样(注意添加
DLL
):进行更改后,执行 构建→批量构建→清理然后是 构建 → 批量构建 → [四个静态 LIB] 如另一个答案中所述。
或者,您可以告诉 QT 使用运行时库的非 DLL 版本。但是现在,通常最容易使用运行时库的 DLL 版本来处理所有事情。
在任一情况下(更改 Crypto++ 或更改 Qt),您仍将使用 Crypto++ 静态 LIB。唯一的区别是静态 LIB 将使用运行时库的 DLL 版本构建,而不是使用运行时库的非 DLL 版本构建。
顺便说一下,这在前一段时间在 上有记录。静态与动态链接 在 Compiling and Integrating Crypto++ into the Microsoft Visual C++ Environment .但我认为解决方案尚不清楚。
关于compiler-construction - 将crypto++库与我的应用程序链接的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174063/