我正在尝试在我的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
一切似乎都很好。但是我有两个问题。
我无法编译调试版本。我认为这是因为我有.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)”中引用(?冲洗@?$ Unflushable @ VFILTER @ CryptoPP @@@ CryptoPP @@ @ UAE_N_NH0 Z)
我得到两个这样的错误,我认为这是由于两个调用lib的函数没有被编译。
我的观察:
好像我正在链接到正确的静态库,即libcrypt.lib,我使用了dumpbin实用程序来确保错误指定的缺失符号存在于lib文件中。
虽然我在.pro文件中指定了一些如何在项目中引用lib的方法。我在.pro文件中添加了以下行来引用静态lib
win32:LIBS + = -L $$ PWD / cryptopp562 / Win32 / Output / Release / -lcryptlib
INCLUDEPATH + = $$ PWD / cryptopp562 DEPENDPATH + = $$ 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项目的正确方法是什么。
答案 0 :(得分:4)
我将在第二个区块回答编辑和评论。
经过多次尝试,最后我收到此错误 - cryptlib.lib(cryptlib.obj): - 1:错误:LNK2038:检测到不匹配 'RuntimeLibrary':值'MT_StaticRelease'与值不匹配 main.obj中的“MD_DynamicRelease”
右键单击cryptlib
项目,然后选择 属性 。
请注意 运行时库 。 Crypto ++默认使用非DLL运行时库;我怀疑QT默认使用运行时库的DLL版本。换句话说,Crypto ++默认使用/MT
或/MTd
。对于Qt集成,您需要/MD
或/MDd
。
要解决此问题,请让Crypto ++为每个配置(调试和发布)和每个平台(Win32和x64)使用运行时库的DLL版本。因此,您的新设置将如此(请注意添加DLL
):
进行更改后,执行 构建→批量构建→清除 ,然后执行 构建→批量构建→[四个静态LIB] < / em> ,如另一个答案所述。
或者,您可以告诉QT使用运行时库的非DLL版本。但是现在,它通常最容易使用运行时库的DLL版本。
在任何一种情况下(更改Crypto ++或更改Qt),您仍将使用Crypto ++静态LIB。唯一的区别是静态LIB将使用运行时库的DLL版本构建,而不是运行时库的非DLL版本。
顺便说一下,这段时间是在Compiling and Integrating Crypto++ into the Microsoft Visual C++ Environment的 静态与动态链接 中记录的。但我认为解决方案尚不清楚。
答案 1 :(得分:0)
我无法编译调试版本。我认为这是因为我有.lib文件的发布版本
您可以在各自的文件夹中找到该库的版本:
<cryptopp>\x64\Output\Release
<cryptopp>\Win32\Output\Release
<cryptopp>\x64\Output\Debug
<cryptopp>\Win32\Output\Debug
我想第一步是确保你正在构建它们。在Visual Studio中,导航到 构建→批量构建 。然后确保选中了四个cryptlib
配置。不要担心其他20个左右的配置/平台组合(可能cryptest
除外,你应该为你的本地平台运行cryptest v
以运行自检)。
确保选中后,选择左上角的 构建 。
crypto.obj:-1:错误:LNK2019:未解析的外部符号“class std :: basic_string,class std :: allocator&gt; const CryptoPP :: DEFAULT_CHANNEL” (?DEFAULT_CHANNEL @ @@ CryptoPP 3V?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ B) 在函数“public:virtual bool __thiscall CryptoPP :: Unflushable :: Flush(bool,int,bool)”中引用 (?冲洗@?$ Unflushable @ VFILTER @ CryptoPP @@@ CryptoPP @@ @ UAE_N_NH0 Z)
听起来您正在链接到DLL,而不是静态LIB。将CRYPTOPP_IMPORTS
添加到您的QT项目设置或预编译的标头中。然后包括Crypto ++包含。由于您要定义CRYPTOPP_IMPORTS
,因此不需要包含Crypto ++的dll.h
。
话虽如此,我建议放弃DLL。 DLL是为FIPS设备提供的,它可能缺少你想要或需要的东西。您应该使用静态LIB而不是DLL。使用静态LIB时,您无需担心定义CRYPTOPP_IMPORTS
。
上面的答案向您展示了如何构建静态LIB的Debug和Release版本。