此警告:
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
with use of other libs; use /NODEFAULTLIB:library
是Visual Studio中相当常见的警告。我想了解它的确切原因以及正确的方法(如果有的话)来处理它。
这是在使用/MDd
编译的调试版本中出现的。该项目与Windows Version.dll
和pdh.dll
之类的内容相关联,后者自身与MSVCRT.dll
相关联。显然,我没有这些的调试版本,无法编译它们。
所以我将/NODEFAULTLIB:MSVCRT
添加到链接器命令行,它确实删除了警告。但这实际上做了什么?为什么有必要呢?
答案 0 :(得分:247)
vc \ lib中有4个版本的CRT链接库:
查看链接器选项,Project + Properties,Linker,Command Line。请注意这里没有提到这些库。链接器自动确定编译器使用了什么/ M开关,以及哪个.lib应通过#pragma comment指令链接。有点重要的是,如果/ M选项与您链接的.lib之间存在不匹配,则会出现可怕的链接错误并难以诊断运行时错误。
当链接器被告知要链接到msvcrt.lib 和 libcmt.lib时,您会看到引用的错误消息。如果将使用/ MT编译的代码与使用/ MD链接的代码链接,将会发生这种情况。 CRT只能有一个版本。
/ NODEFAULTLIB告诉链接器忽略从/ MT编译代码生成的#pragma comment指令。这可能有效,尽管其他一些链接器错误并不少见。像 errno 这样的东西,它是静态CRT版本中的extern int,但是对DLL版本中的函数进行宏编辑。许多其他人都喜欢这样。
好吧,正确的方法修复此问题,找到您使用错误/ M选项编译的链接的.obj或.lib文件。如果你没有任何线索,那么你可以通过点击“/ MT”的.obj / .lib文件来找到它
Btw:Windows可执行文件(如version.dll)有自己的CRT版本来完成工作。它位于c:\ windows \ system32,您无法可靠地将它用于您自己的程序,其CRT标头在任何地方都无法使用。程序使用的CRT DLL具有不同的名称(如msvcrt90.dll)。答案 1 :(得分:42)
这意味着其中一个依赖dll使用不同的run-time library进行编译。
项目 - >属性 - > C / C ++ - >代码生成 - >运行时库
浏览所有库,看看它们是以相同的方式编译的。
此链接中有关此错误的更多信息:
warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs
答案 2 :(得分:29)
Yochai,如果您读过这篇文章,请参阅最后的说明。
原帖为:warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs
LINK:警告LNK4098:defaultlib“LIBCD”与其他lib的使用冲突;使用/ NODEFAULTLIB:库
系统的一部分被编译为使用单线程标准(libc)库以及静态链接的调试信息(libcd)
虽然系统的另一部分被编译为使用多线程标准库而没有调试信息,这些信息驻留在DLL中并使用动态链接
忽略警告,毕竟它只是一个警告。但是,您的程序现在包含多个具有相同功能的实例。
使用链接器选项/ NODEFAULTLIB:lib。这不是一个完整的解决方案,即使你可以让你的程序以这种方式链接你忽略了一个警告标志:代码已经针对不同的环境进行了编译,你的一些代码可能被编译为单线程模型,而其他代码则是多线程。
[...]浏览所有图书馆并确保他们拥有正确的链接设置
在后者中,正如原帖中提到的那样,可能会出现两个常见问题:
您有第三方库,其链接方式与您的应用程序不同。
您的代码中嵌入了其他指令:通常这是MFC。如果系统中的任何模块与MFC链接,则所有模块必须名义上链接到相同版本的MFC。
对于这些情况,请确保您了解问题并在解决方案中做出决定。
注意:我想将Yochai Timmer链接的摘要包含在他自己的答案中,但由于有些人无法正确审阅编辑,我必须在单独的答案中写下。遗憾
答案 3 :(得分:6)
每次我想在VC ++中创建应用程序时都会得到这个。
右键单击项目,选择“属性”,然后在“配置属性”下C / C ++ |代码生成',为调试配置选择“多线程调试(/ MTd)”。
请注意,这不会更改发布配置的设置 - 您需要转到相同的位置并为发布选择“多线程(/ MT)”。
答案 4 :(得分:3)
右键单击项目,选择“属性”,然后选择“配置属性”链接器|输入|忽略特定的库并写入msvcrtd.lib