带有 /MTd 的 QT 和 Crypto++

QT and Crypto++ with /MTd

我有两个带有 MSVC2013 32 位编译器的 QT 5.5 项目。第一个是 Qt 控制台应用程序,在 pro 文件中使用 crypto++ 和这两个:

QMAKE_CXXFLAGS_RELEASE += /MT
QMAKE_CXXFLAGS_DEBUG += /MTd

第二个是 Qt widgets 应用程序,它构建了基于对话框的 GUI。单独地,每个都成功启动,但也单独地在 pro 文件中添加相同的 GUI 项目,就像上面这些一样,给出了同样的旧错误:

qtmain.lib(qtmain_win.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj

有没有办法以某种方式将这两个项目联合起来?也请解释一下意思和区别:

multi-threaded DLL(/MD)
multi-threaded (/MT)

动态库和/MD、静态库和/MT之间的link是什么?

qtmain.lib(qtmain_win.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary':
value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj

这是由于混合和匹配 C/C++ 运行时库。

Crypto++ 有四个项目:Cryptlib, CryptestCryptdllDlltest。更复杂的是,Cryptlib, Cryptest Cryptdll[=37= 重新使用了 DLL 导入配置]Dlltest。一旦你理解了发生的事情,它就会有很多逻辑意义。

您link反对非 DLL 导入 Cryptlib,它使用静态 linking。您需要针对动态 linked 运行时库切换到 linking。为此,请参阅 Compiling and Integrating Crypto++ into the Microsoft Visual C++ Environment。它很旧,但仍然适用。

您还应该避免任何路径中带有DLL_Output的东西。尽管它使用适当的运行时库 linking,但您正试图 link 针对 DLL。 DLL 存在一个目的 - 作为 FIPS 140-2 验证模块的安全边界。通常不是你要找的,而且通常 图书馆。

因为你还应该避免任何带有DLL_Output的东西,打开配置管理器并删除任何相关的DLL(例如, DLL-Import Release)。您还应该完全删除 CryptdllDlltest 个简化您生活的项目。