2013-08-25 89 views
1

我在我的项目中使用第三方.lib文件。虽然我们的项目的基础很好,似乎运作良好,我从连接器得到这样的警告:LNK4098 - 它有多危险?

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

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

  • 此警告有多危险?
  • 什么是可能的结果?
  • 我们的项目在我们的办公室运作良好,我们是否应该预料在现实生活中意外的崩溃 ?

回答

1

如果它构建正确,那就很好。

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

2

“LIBCMT”是Microsoft的多线程C运行时库。微软的编译器将信息添加到它创建的目标文件中,以便链接器知道编译器认为你想链接哪个版本的运行时库。此警告意味着两个或多个目标文件中的信息指向版本的运行时库的不同版本。这是一个问题,并且警告提示您关闭DEFAULTLIB选项的建议是真的很差。相反,找出冲突来自哪里并解决它。我好几年没有使用MS的工具,所以我不能告诉你哪个工具做什么的细节,但是有一个工具可以从目标文件中剔除信息(也许objdump?),并且有正确的选项为您提供嵌入在每个对象文件中的库信息。这反过来又会指向导致问题的目标文件。然后你必须弄清楚它为什么认为它需要这个版本;这通常是编译时使用的编译器选项的结果。因此,例如,如果一个目标文件构建为多线程,另一个构建为单线程,则会发生类似的冲突。你不能忽视它;如果应用程序使用多个线程,并且链接器被拉入单线程库而不是多线程库,则会在未正确同步的函数中发生神秘的崩溃。