我有两个带有 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
有没有办法以某种方式将这两个项目 union 起来?也请解释一下意思和区别:
multi-threaded DLL(/MD)
multi-threaded (/MT)
动态库和/MD、静态库和/MT有什么关系?
最佳答案
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
, Cryptest
, Cryptdll
和 Dlltest
。更复杂的是, Cryptlib
, Cryptest
有 重新使用的 DLL 导入配置 Cryptdll
和 Dlltest
。一旦您理解了正在发生的事情,它就具有很多逻辑意义。
您正在链接非 DLL 导入 Cryptlib
,它使用静态链接。您需要切换到链接动态链接的运行时库。为此,请参阅 Compiling and Integrating Crypto++ into the Microsoft Visual C++ Environment .它很旧,但仍然适用。
您还应该避免任何带有DLL_Output
的东西在它的路径上。尽管它使用正确的运行时库链接,但您正试图链接 DLL。 DLL 存在一个目的 - 作为 FIPS 140-2 验证模块的安全边界。它通常不是您要找的东西,而且通常是错误的库。
因为您还应该避免任何带有DLL_Output
的东西,打开配置管理器并删除任何与 DLL 相关的内容(例如, DLL-Import Release
)。您还应该完全删除 Cryptdll
和 Dlltest
旨在简化您生活的项目。
关于c++ - QT 和 Crypto++ with/MTd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33254054/