将crypto ++库与我的应用程序链接的正确方法

时间:2014-06-11 23:10:53

标签: compiler-construction qt5 unresolved-external crypto++

我正在尝试在我的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项目的正确方法是什么。

2 个答案:

答案 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

enter image description here

要解决此问题,请让Crypto ++为每个配置(调试和发布)和每个平台(Win32和x64)使用运行时库的DLL版本。因此,您的新设置将如此(请注意添加DLL):

enter image description here

进行更改后,执行 构建→批量构建→清除 ,然后执行 构建→批量构建→[四个静态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文件的发布版本

您可以在各自的文件夹中找到该库的版本:

  • 发布x64:<cryptopp>\x64\Output\Release
  • 发布Win32:<cryptopp>\Win32\Output\Release
  • 调试x64:<cryptopp>\x64\Output\Debug
  • 调试Win32:<cryptopp>\Win32\Output\Debug

我想第一步是确保你正在构建它们。在Visual Studio中,导航到 构建→批量构建 。然后确保选中了四个cryptlib配置。不要担心其他20个左右的配置/平台组合(可能cryptest除外,你应该为你的本地平台运行cryptest v以运行自检)。

enter image description here

确保选中后,选择左上角的 构建


  

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版本。