解决LNK4098:defaultlib'MSVCRT'冲突

这个警告:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 

是在Visual Studio中相当常见的警告>我想了解它的确切原因和正确的方法(如果有的话)来处理它。

这出现在一个debugging版本中,用/MDd编译。 该项目链接到像Windows Version.dllpdh.dll ,它们自己与MSVCRT.dll链接的东西。 显然,我没有这些debugging版本,不能编译它们。

所以我添加/NODEFAULTLIB:MSVCRT到链接器命令行,它实际上删除了警告。 但是这实际上是做什么的? 为什么这是必要的?

vc \ lib中有4个版本的CRT链接库:

  • libcmt.lib:发布版本的静态CRT链接库(/ MT)
  • libcmtd.lib:用于debugging版本的静态CRT链接库(/ MTd)
  • msvcrt.lib:用于发布DLL版本的CRT(/ MD)的导入库
  • msvcrtd.lib:CRT的debuggingDLL版本的导入库(/ MDd)

看看链接器选项,项目+属性,链接器,命令行。 注意这里没有提到这些库。 链接器会自动找出编译器使用的/ M开关,以及哪个.lib应该通过#pragma注释指令链接。 有一点很重要,如果在/ M选项和链接的.lib之间存在不匹配的情况,那么会出现可怕的链接错误,难以诊断运行时错误。

当链接器被告知链接到msvcrt.lib libcmt.lib时,您将看到您引用的错误消息。 如果将使用/ MT编译的代码与使用/ MD链接的代码链接,会发生这种情况。 只能有一个版本的CRT。

/ NODEFAULTLIB告诉链接器忽略从/ MT编译代码生成的#pragma注释指令。 这可能工作,虽然一连串的其他链接器错误并不罕见。 像errno这样的东西,它是静态CRT版本中的extern int,但在DLL版本中被macros指令化为函数。 许多其他人喜欢这样。

那么,正确的解决这个问题,find你正在链接的.obj或.lib文件,这个文件是用错误的/ M选项编译的。 如果你没有线索,那么你可以通过grep .obj / .lib文件find“/ MT”

顺便说一句:Windows可执行文件(如version.dll)有自己的CRT版本,以完成他们的工作。 它位于c:\ windows \ system32中,你不能可靠地将它用于你自己的程序,它的CRT头文件在任何地方都不可用。 您的程序使用的CRT DLL具有不同的名称(如msvcrt90.dll)。

这意味着一个依赖的dll被编译了一个不同的运行时库 。

项目 – >属性 – > C / C ++ – >代码生成 – >运行时库

浏览所有的库,看看它们是以相同的方式编译的。

更多关于这个链接中的这个错误:

警告LNK4098:defaultlib“LIBCD”与其他库的使用冲突

IMO从Yochai Timmer 这个链接是非常好的和相关的,但痛苦的阅读。 我写了一个总结。

Yochai,如果你读过这个,请看最后的说明。


对于原来的post阅读: 警告LNK4098:defaultlib“LIBCD”与其他库的使用冲突

错误

链接:警告LNK4098:defaultlib“LIBCD”与使用其他库相冲突; 使用/ NODEFAULTLIB:库

含义

系统的一部分被编译为使用带有静态链接的debugging信息(libcd)的单线程标准(libc)库

而系统的另一部分被编译为使用multithreading标准库,而没有驻留在DLL中的debugging信息并使用dynamic链接

如何解决

  • 忽略警告,毕竟这只是一个警告。 但是,您的程序现在包含相同function的多个实例。

  • 使用链接器选项/ NODEFAULTLIB:lib。 这不是一个完整的解决scheme,即使你可以让你的程序链接这种方式,你忽略了一个警告标志:代码已被编译为不同的环境,你的代码可能编译为单线程模型,而其他代码是multithreading。

  • 拖曳您的所有库,并确保它们具有正确的链接设置

在后者中,正如原文所述,可能会出现两个常见的问题:

  • 您有一个第三方库,它与您的应用程序链接不同。

  • 您的代码中embedded了其他指令:通常这是MFC。 如果系统中的任何模块链接到MFC,则所有模块必须名义上链接到相同版本的MFC。

对于这些情况,请确保您了解问题并决定解决scheme。


注意:我想将Yochai Timmer的链接汇总到他自己的答案中,但是由于有些人无法正确地检查编辑,所以我必须在单独的答案中写下它。 抱歉

每当我想在VC ++中创build一个应用程序,我都会得到这个。

右键单击项目,select“属性”,然后在“configuration属性”下 C / C ++ | 代码生成“,为debuggingconfigurationselect”multithreadingdebugging(/ MTd)“。

请注意,这不会更改发布configuration的设置 – 您需要转到相同的位置,然后为发布select“multithreading(/ MT)”。

右键单击项目,select“属性”,然后在“configuration属性”下 链接器| input| 忽略特定的库并写入msvcrtd.lib