LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 file.obj 中的值“MD_DynamicRelease”不匹配
Posted
技术标签:
【中文标题】LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 file.obj 中的值“MD_DynamicRelease”不匹配【英文标题】:LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in file.obj 【发布时间】:2015-05-07 08:41:53 【问题描述】:我正在将Matlab
、C
和Cuda
集成到一个项目中。我使用Matlab mix为了将用c编写的matlab mx函数与cuda运行时库连接起来,出现关于c文件和库之间的静态发布和动态发布冲突的链接错误。谁能解决这个问题?
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in file.obj.
【问题讨论】:
【参考方案1】:当您静态将项目与库(通常是扩展名为 .lib 的文件)链接但您的 Visual Studio 项目中的链接器设置设置为 动态 链接(意味着链接将在运行时发生,通常使用 .dll 文件)。
要定义您需要项目使用静态链接,请启动 Visual Studio。在 Solution Explorer 窗格中,右键单击项目名称,然后选择 Properties。展开如下图的属性:C/C++ --> Code Generation --> Runtime Library,在下拉菜单中选择Multi-threaded (/MT)
选项。
【讨论】:
这没有解决严重性代码描述项目文件行抑制状态错误 LNK2038 检测到“RuntimeLibrary”不匹配的错误:值“MD_DynamicRelease”与 Calibration.obj OpenARK 中的值“MT_StaticRelease”不匹配-SDK C:\OpenARK\OpenARK-SDK\libboost_system-vc140-mt-1_61.lib(error_code.obj) 1 如果我通过控制台 (CMD) 运行我的代码,如何执行此操作?【参考方案2】:库和您的项目必须使用与 C 运行时库相关的相同设置链接。
在您的情况下,一个链接到 CRT DLL (/MD),另一个链接到静态 (/MT)。
您只需要确保 match 和 this error 都会消失。
【讨论】:
要求所有源文件都已使用定义的预处理器符号 _DEBUG 进行编译的“原因”是什么?出于性能目的而编译要为发布而编译的编译单元是什么? @harper:您可以使用定义的不同预处理器符号编译不同的编译单元。您不能链接到不同版本的 CRT/C++ 标准库,如本答案中的链接中所述。预处理器符号不控制库/应用程序链接到哪个 CRT。这由传递给链接器的命令行开关控制。 如何在 UI 中更改它? @xaxxon 右键项目 -> 属性 -> C/C++ -> 代码生成。链接选项在其中列出。 @harper 想象带有 #ifdef _DEBUG 或等效项的标题或代码体。它们被 Release 和 Debug 版本引用。它们还访问基于 _DEBUG 定义/未定义的成员变量,并且可以根据构建类型进行其他调用。你将如何让它发挥作用?可靠吗?【参考方案3】:出于分享目的。
我正在使用 2017 VS 版本,它成功打开并运行旧的 2008 解决方案。现在,如果由于某种原因,即使您将所有库和主项目更改为具有相同的运行时库参数(在属性下,请参见上面的海报),但您仍然收到相同的错误消息,请尝试打开每个单独的 .vcxproj 文件.在“RuntimeLibrary”下搜索并在所有 vcxproj 文件中使它们的值相同。出于某种原因,这些 vcxproj 文件永远不会更新到我在属性设置中声明的相同值,我必须在 vcxproj 中手动更改它们。
如果您愿意,也可以打开 vcproj 文件并将它们的“RuntimeLibrary”也更改为相同。这里的值是数字。
【讨论】:
【参考方案4】:正如其他人提到的,cl.exe 上的运行时库开关必须在所有已编译模块之间匹配。在 MSBuild 中,这被称为 ClCompile>/RuntimeLibrary。
但是,即使这些匹配,如果您的项目中某处存在“#undef DEBUG”或“#undef _DEBUG”,您仍可能会遇到此问题。如果更改了这些宏,作为 VC++ 运行时库头文件一部分的 yvals.h 头文件可以更改编译到您的 obj 文件中的内容。
使用“dumpbin /all foo.obj >foo.txt”来检查你的 obj 文件中的实际内容。在该输出中查找标题“链接器指令”。
【讨论】:
【参考方案5】:以下是修复的正确步骤
Error 69 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'
这意味着运行时库是 static 又名 lib ( MT_StaticRelease ) 这与您的项目价值不同 Dynamic Lib 又名 dll (MD_DynamicRelease)
右键解决方案 点击属性 配置属性->常规将配置类型从 Dynamic Lib (dll)
更改为 Static Lib (lib)如果您遇到相反的情况并且上述步骤无法解决问题,请使用此选项
C/C++ --> 代码生成 --> 运行库选择 多线程
【讨论】:
运行时库设置完全独立于构建.lib 或.dll。不要更改库类型以防止运行时库不匹配。【参考方案6】:作为对 GWKit 的评论,这会更好,但我没有这方面的声誉。他提到必须更新 vcxproj 文件,因为它们实际上并没有改变。在我的情况下,他们只有在点击“saveAll”然后关闭视觉工作室后才保存。我收到一个提示,询问我是否要保存对已保存属性的更改,单击“是”后,vcxproj 文件已正确更新。
【讨论】:
【参考方案7】:此链接器错误是由于项目配置不正确而发生的,可能是您在与主项目配置不同的配置中构建了库。如果您的项目配置是 release\debug,那么您应该在构建库时选择相同的配置。
【讨论】:
以上是关于LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 file.obj 中的值“MD_DynamicRelease”不匹配的主要内容,如果未能解决你的问题,请参考以下文章
为“_MSC_VER”检测到错误 LNK2038 不匹配:值“1700”与 xxxx.obj 中的值“1900”不匹配
错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“2”与 XX.obj 中的值“0”不匹配
在 VS 2012 (C++) 中编译 Visual Studio 2010 项目:错误 LNK2038:检测到“_MSC_VER”不匹配:值“1600”与值“1700”不匹配
LNK2038, LNKC4743,LNK4098,LNK2001
error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”
error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug