c++ - QT 和 Crypto++ with/MTd

标签 c++ qt user-interface crypto++

我有两个带有 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/

相关文章:

java - 在 GUI 中调用 actionPerformed 时如何调用方法

android - 通缉 : TableLayout-Like ListView

c++ - fatal error LNK1104 : cannot open file 'sfml-system-s-d.lib'

c++ - 可以初始化但不能赋值的对象

c++ - 在 Visual Studio 和 Qt Creator 中同时开发

javascript - for 循环中的 Qt.bound

python - 将 QPainterPath 简化为轮廓

c++ - 如何使用 CMake 将 NMake 从 VS9 切换到 VS10

c++ - 使用 boost ptr_unordered_map

qt - 是否可以仅显示 QML ListView 的某些索引?