gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:47:37 25 4
gpt4 key购买 nike

我正在尝试在我的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com