1

我在我的项目中使用了第 3 方 .lib 文件。虽然我们的项目构建良好并且似乎运行良好,但我从链接器收到此警告:

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

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

  • 这个警告有多危险?
  • 可能的结果是什么?
  • 我们的项目在我们的办公室运行良好,我们应该期待现实生活中的意外崩溃吗?
4

2 回答 2

2

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

于 2013-08-25T16:57:36.927 回答
1

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

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

于 2013-08-25T15:01:52.777 回答