LNK4098-它有多危险

LNK4098 - How Dangerous Is It?

本文关键字:危险 LNK4098-      更新时间:2023-10-16

我在项目中使用第三方.lib文件。虽然我们的项目构建得很好,而且似乎运行得很好。但我从链接器收到了以下警告:

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

我的项目是一个使用多线程dll运行库(/MD选项)的.dll。我们没有可以链接的.lib文件的其他版本。

  • 这个警告有多危险
  • 可能的结果是什么
  • 我们的项目在我们的办公室运行良好,如果我们预料到意外的崩溃在现实生活中
"LIBCMT"是微软的多线程C运行库。微软的编译器将信息添加到它创建的对象文件中,这样链接器就会知道编译器认为你想链接到哪个版本的运行库。此警告意味着两个或多个对象文件中的信息指向运行库的不同版本。这是一个问题,警告给出的关闭DEFAULTLIB选项的建议非常糟糕。相反,找出冲突的来源并解决它。我已经好几年没有使用MS的工具了,所以我无法向您详细说明哪种工具可以做什么,但有一种工具可以从对象文件(可能是objdump?)中转储信息,并具有正确的选项,可以为您提供嵌入每个对象文件中的库信息。反过来,它会将您指向导致问题的对象文件。然后你必须弄清楚为什么它认为它需要那个版本;这通常是编译时使用的编译器选项的结果。因此,例如,如果一个对象文件被构建为多线程,而另一个被构建为单线程,您将得到这样的冲突。你不能忽视它;如果应用程序使用多个线程,并且链接器被拉入单线程库而不是多线程库,那么在未正确同步的函数中会出现神秘的崩溃。

如果构建正确,您就可以了。

危险在于libcmt定义了一些函数,这些函数也由您正在使用的其他库定义。在这种情况下,您将得到错误(在链接时)说一个符号是多重定义的。但是,如果它构建时没有错误,那么生成的可执行文件应该是好的。