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

标签 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)”中引用 (?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 项目的正确方法是什么。

    最佳答案

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

    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 集成。

    enter image description here

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

    enter image description here

    进行更改后,执行 构建→批量构建→清理然后是 构建 → 批量构建 → [四个静态 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/

    相关文章:

    c++ - 在 Windows 上为 Mac/Linux 编译

    qt - 使用 QSortFilterProxyModel 过滤 QTreeView 中的父行而不是子行

    c++ - 为什么在调用 QXYSeries::replace() 后,当 size() 尚未超过capacity() 时,QVector 的地址会发生变化?

    c++ - 什么是 undefined reference / Unresolved external symbol 错误,我该如何解决?

    c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

    c - 了解空 main() 到程序集的翻译

    c# - 如何从 LambdaExpressions 创建的 MethodBuilders 创建可相互调用的 MethodInfos?

    dynamic-linking - 位置独立代码 : what is the difference at compile time?

    c++ - 如何将openCV中裁剪图像的数据数组转换为Qt中的RGB直方图

    c++ - 目标文件中未解析的外部符号