Visual Studio 链接器警告 LNK4098

5
我有一个dll项目,当我在Release配置下构建该项目时,会收到以下警告:
MSVCRT.lib(cinitexe.obj) :warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
这只是一个警告,但我不知道是否应该考虑它。
根据我所了解的,它们都是多线程库,普通版本和调试版本。我的dll使用多线程,我可以调试它,尽管我使用boost:thread进行调试,所以我真的不知道我是否需要这些Windows特定的库来进行调试或发布构建...
亲切的问候, Alex
好吧,我按照BuschnicK的建议做了,使用/VERBOSE:LIB链接器标志,我发现我在Debug配置中链接到了这些库:
boost_filesystem-vc100-mt-gd-1_44.lib: libboost_system-vc100-mt-gd-1_44.lib: libboost_thread-vc100-mt-gd-1_44.lib: libboost_date_time-vc100-mt-gd-1_44.lib:
我在Release配置中也有同样的设置,主要是因为我没有明确地指定它们。因此,我在Release中将它们更改为:
boost_filesystem-vc100-mt-1_44.lib: libboost_system-vc100-mt-1_44.lib: libboost_thread-vc100-mt-1_44.lib: libboost_date_time-vc100-mt-1_44.lib:
这似乎起作用了,但我仍然收到第一个警告,直到我意识到我的Release配置中也有_DEBUG预处理器定义,将其删除后,现在工作得很好。
感谢大家的帮助!
2个回答

10
如果你仔细阅读信息,它会告诉你问题出在哪里:"MSVCRT.lib"与"msvcrtd.lib"不同,要注意第二个库名中添加了字母"d"。问题是你正在静态链接Visual Studio C++运行时(MSVCRT)。你的某个库正在引用发布版本的该库,而另一个库则在引用调试版本(因此有后缀"d")。链接器告诉你两个库定义了相同名称的函数,存在冲突,因此其中之一会被自动删除。
为了解决这个问题,请检查所有项目/库的构建设置,并确保它们在所有构建配置中都使用了相同的运行时库。在“项目属性”->“C/C++”->“代码生成”->“运行时库”中查找。对于发布版本,这应该是“多线程”,对于调试版本,这应该是“多线程调试”。
请注意,静态链接这些库通常被认为是不好的做法,你应该优先选择动态链接的dll版本。

MSVCRT已经是动态版本。虽然是通过导出库链接,但您仍然必须链接到它。http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx - Steve Townsend
嗯,我检查了两个配置,在Debgug -> 多线程调试DLL (/MDd) 和 Release -> 多线程DLL (/MD) 中,但我仍然收到警告,我是否需要在发布配置中使用 /NODEFAULTLIB:MSVCRTD.LIB? - AlejandroVK
1
不,你不应该使用nodefaultlib。看一下你链接的所有外部库。其中至少有一个会引入冲突的运行时。 - BuschnicK
为什么你说这是黑客行为?我已经在我的调试配置中链接了调试Boost库和MSVCRTD.lib,而在发布中链接了发布Boost库和MSVCRT.lib……哪里有黑客行为?实际上,我认为我是以相当“标准”的方式进行操作的,我从来不喜欢做恶心的事情。 - AlejandroVK
喜欢这个答案。非常感谢你。 - CroCo
显示剩余3条评论

7
听起来你可能在同一构建中运行调试库和发布编译库。请检查项目选项,并选择使用任何第三方库的调试版本。

我使用的唯一需要进行库链接的 Boost 库是文件系统,它有两个版本: - AlejandroVK
忘记上一个评论:我使用的唯一需要链接lib的boost库是filesystem,它有两个版本:boost_filesystem-vc100-mt-gd-1_44.lib和boost_filesystem-vc100-mt-1_44.lib。我猜第一个是用于多线程调试,第二个只是mt。我从来没有在链接器选项中指定要选择哪个,它会“自动”选择...这可能是问题的根源吗? - AlejandroVK

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