LNK2038错误: 'RuntimeLibrary'的值在文件.obj中为'MD_DynamicRelease',与值'MT_StaticRelease'不匹配。

94

我正在一个项目中将MatlabCCuda集成在一起。我使用了Matlab混合编程,以连接用C编写的matlab mx函数和cuda运行时库,但是出现了关于c文件和库之间静态发布和动态发布冲突的链接错误。有人能解决这个问题吗?

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in file.obj. 
7个回答

95

当您将项目与库(通常是扩展名为.lib的文件)进行静态链接,但Visual Studio项目中的链接器设置为动态链接(这意味着链接将在运行时发生,通常使用.dll文件),可能会发生此错误。

要定义需要使用静态链接的项目,请启动Visual Studio。 在Solution Explorer窗格中,右键单击项目名称,选择属性。展开属性,如下图所示:C/C++--> 代码生成 --> 运行时库,从下拉菜单中选择多线程(/MT)选项。 enter image description here


4
这项操作没有解决错误 "Severity Code Description Project File Line Suppression State Error LNK2038"。在 Calibration.obj 中,'RuntimeLibrary' 的值 'MD_DynamicRelease' 与 libboost_system-vc140-mt-1_61.lib(error_code.obj) 中的值 'MT_StaticRelease' 不匹配,发现了不匹配的情况。 - Mona Jalal
4
如果我通过控制台(CMD)运行我的代码,该如何执行此操作? - Scott

68

这个库和你的项目必须以关于C运行时库相同的设置进行链接。

在你的情况下,一个库是与CRT DLL(/MD)链接的,另一个是静态链接(/MT)。

您只需要确保两者匹配,这个错误就会消失。


4
所有源文件都必须使用预处理器符号_DEBUG定义进行编译的“原因”是什么?有什么阻碍编译编译单元以供性能目的发布? - harper
@harper:你可以使用不同的预处理器符号编译不同的编译单元。但是,你不能链接到不同版本的CRT/C++标准库,正如在这个答案中所解释的那样。预处理器符号并不控制库/应用程序链接到哪个CRT。这由传递给链接器的命令行开关来控制。 - IInspectable
3
你在用户界面(UI)中如何更改它? - xaxxon
5
在项目上右键单击 -> 属性 -> C/C++ -> 代码生成。链接选项在其中列出。 - EntangledLoops
@harper 想象一下带有#ifdef _DEBUG或等效代码的头文件或代码主体。它们被发布版和调试版都引用。它们还访问基于_DEBUG定义/未定义的成员变量,并且可能根据构建类型进行其他调用。你如何使其工作?可靠地? - Technophile
显示剩余2条评论

5
以下是修复问题的正确步骤。
Error   69  error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'

这意味着运行时库是静态,也就是lib ( MT_StaticRelease )。这与您项目的值动态库(也称为dll)(MD_DynamicRelease)不同。

  • 右键单击解决方案
  • 点击属性
  • 配置属性 -> 常规

配置类型动态库 (dll)更改为静态库 (lib)

enter image description here

如果您遇到反向情况,上述步骤无法解决问题,则可以尝试调整以下选项

C/C++ --> 代码生成 --> 运行时库选择多线程 enter image description here


5
运行库设置与选择构建 .lib 或 .dll 文件类型完全无关。不要更改库的类型来尝试防止运行库不匹配。 - John

5

为了共享目的。

我正在使用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文件中的内容。在输出中查找标题"Linker Directives"。
注:Original Answer翻译成“最初的回答”

谢谢。我遇到了'MT_StaticRelease'不匹配值'MTd_StaticDebug'的问题,尽管一切都设置为/MT。将Preprocessor Definition_DEBUG改为NDEBUG解决了我的构建问题。 - Bart

0
这段话与GWKit的评论更相关,但我没有足够的声望。他提到需要更新vcxproj文件,因为它们实际上并没有改变。在我的情况下,只有在点击“saveAll”并关闭Visual Studio后才保存了它们。我收到了一个提示,询问是否要保存已保存的属性更改,点击是后,vcxproj文件得到了正确的更新。

-1

这个链接器错误是由于不正确的项目配置引起的,可能是您在与主项目配置不同的配置中构建了库。如果您的项目配置是release\debug,则在构建库时应选择相同的配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接