Mur*_*bul 4 compiler-construction unresolved-external crypto++ qt5
我正在尝试在我的 Qt 应用程序中使用 Crypto++ 库。
Qt 版本为 5.3.0 在 Windows 8.1 上运行 VS2013 编译
用 VS2013 编译的 Crypto++ Lib
这是我的 .pro 文件中链接 lib 的部分
win32: LIBS += -L$$PWD/cryptopp562/Win32/DLL_Output/Release/ -lcryptopp
INCLUDEPATH += $$PWD/cryptopp562
DEPENDPATH += $$PWD/cryptopp562
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好。但是我有两个问题。
我无法编译调试版本。我认为这是因为我有 .lib 文件的发布版本
当我尝试编译我的应用程序时,出现以下错误
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 的函数没有被编译。
我的观察:
似乎我正在链接到正确的静态库,即 libcrypt.lib,并且我使用了 dumpbin 实用程序来确保错误指定的缺失符号存在于 lib 文件中。
看来,虽然我在 .pro 文件中指定了一些 lib 没有被项目引用的方式。我已将以下行放在我的 .pro 文件中以引用静态库
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 项目的正确方法是什么。
我将在第二个块中回答编辑和评论。
经过多次尝试,最后我得到了这个错误 - cryptlib.lib(cryptlib.obj):-1: error: LNK2038: mismatch detection for 'RuntimeLibrary': value 'MT_StaticRelease' does not match value 'MD_DynamicRelease' in main.obj
右键单击该cryptlib
项目,然后选择Properties。
注意运行时库。Crypto++ 默认使用非 DLL 运行时库;我怀疑 QT 默认使用运行时库的 DLL 版本。换句话说,Crypto++ 使用/MT
或/MTd
默认情况下。而您需要/MD
或/MDd
进行 Qt 集成。
要解决此问题,请让 Crypto++ 为每个配置(调试和发布)和每个平台(Win32 和 x64)使用运行时库的 DLL 版本。因此,您的新设置将如下所示(注意添加了DLL
):
进行更改后,执行Build ?批量构建 ? 清洁然后构建?批量构建 ? [四个静态 LIB]如另一个答案中所述。
或者,您可以告诉 QT 使用运行时库的非 DLL 版本。但是现在,通常最容易使用运行时库的 DLL 版本来处理所有事情。
在任一情况下(更改 Crypto++ 或更改 Qt),您仍将使用 Crypto++ 静态 LIB。唯一的区别是静态 LIB 将使用运行时库的 DLL 版本构建,而不是使用运行时库的非 DLL 版本构建。
顺便说一句,这是记录在案前一段时间在静态与动态链接在编译和集成加密+到Microsoft Visual C ++环境。但我认为解决方案尚不清楚。