【问题标题】:Correct way of linking crypto++ library with my application将crypto++库与我的应用程序链接的正确方法
【发布时间】:2014-08-02 04:02:09
【问题描述】:

我正在尝试在我的 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: error: LNK2019: unresolved external symbol "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 文件中指定了一些项目未引用该库的方式。我已在我的 .pro 文件中放入以下行以引用静态库

    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++ 库链接到 Qt 项目的正确方法是什么。

【问题讨论】:

  • 你觉得这个怎么样?

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


【解决方案1】:

我将在第二个区块中回答编辑和评论。

经过多次尝试,我终于得到了这个错误 - cryptlib.lib(cryptlib.obj):-1:错误:LNK2038:检测到不匹配 “RuntimeLibrary”:值“MT_StaticRelease”与值不匹配 main.obj 中的“MD_DynamicRelease”

右击cryptlib项目,然后选择Properties

注意运行时库。 Crypto++ 默认使用非 DLL 运行时库;我怀疑 QT 默认使用运行时库的 DLL 版本。换句话说,Crypto++ 默认使用/MT/MTd。并且您需要 /MD/MDd 进行 Qt 集成。

要解决此问题,请 Crypto++ 为每个配置(调试和发布)和每个平台(Win32 和 x64)使用运行时库的 DLL 版本。所以你的新设置看起来像这样(注意添加了DLL):

进行更改后,执行 Build → Batch Build → Clean,然后执行 Build → Batch Build → [四个静态 LIB] 如另一个答案中所述。

或者,您可以告诉 QT 使用运行时库的非 DLL 版本。但是现在,通常最容易使用运行时库的 DLL 版本来处理所有事情。

在任何一种情况下(更改 Crypto++ 或更改 Qt),您仍将使用 Crypto++ 静态 LIB。唯一的区别是静态 LIB 将使用运行时库的 DLL 版本构建,而不是运行时库的非 DLL 版本。

顺便说一句,这已在不久前的 Static Versus Dynamic Linking 上记录在 Compiling and Integrating Crypto++ into the Microsoft Visual C++ Environment。但我认为解决方案尚不清楚。

【讨论】:

  • 太好了,你拯救了我的一天,我可以要你的电子邮件/Skype 吗?
【解决方案2】:

我无法编译调试版本。我认为这是因为我有 .lib 文件的发布版本

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

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

我想第一步是确保您正在构建它们。在 Visual Studio 中,导航到 Build → Batch Build。然后确保检查了四个cryptlib 配置。不要担心其他 20 种左右的配置/平台组合(除了 cryptest,您应该为您的原生平台运行它,而 cryptest v 运行自测)。

确保勾选后,选择左上角的Build


crypto.obj:-1:错误:LNK2019:未解析的外部符号“类 std::basic_string,类 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)

听起来您正在链接到 DLL,而不是静态 LIB。将CRYPTOPP_IMPORTS 添加到您的 QT 项目设置或预编译头文件中。然后包括 Crypto++ 包括。由于您正在定义 CRYPTOPP_IMPORTS,您确实不需要需要包含 Crypto++ 的 dll.h

话虽如此,我建议放弃 DLL。 DLL 是为 FIPS 设备提供的,它可能缺少一些您想要或需要的东西。您应该使用静态 LIB,而不是 DLL。使用静态 LIB 时,无需担心定义CRYPTOPP_IMPORTS

上面的答案向您展示了如何构建静态 LIB 的 Debug 和 Release 版本。

【讨论】:

  • 我按照说明进行了以下观察。 - 1.似乎我正在尝试链接我使用dumpbin实用程序检查的正确静态库,并且我得到错误的所有符号都在那里。 2. 似乎有些我无法在我的 qtcreator 项目中指定库。理想情况下,应该在 pro 文件中引用 lib 文件,但它没有做出来
  • 这里是 .pro 文件中的文本--- 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
  • 我已经修改了问题并添加了更多细节以使事情变得清晰。
  • 经过多次尝试,最后我得到了这个错误 - cryptlib.lib(cryptlib.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match main.obj 中的值“MD_DynamicRelease”
猜你喜欢
  • 2015-10-05
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多