我在项目中使用第三方.lib文件。虽然我们的项目构建良好并且似乎运行良好,但我从链接器收到此警告:
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
我的项目是一个使用多线程DLL运行时库(/ MD选项)的.dll。我们没有可以链接的.lib文件的不同版本。
答案 0 :(得分:2)
“LIBCMT”是Microsoft的多线程C运行时库。 Microsoft的编译器将信息添加到它创建的目标文件中,以便链接器知道编译器认为您想要链接的运行时库的哪个版本。此警告表示两个或多个目标文件中的信息指向运行时库的不同版本。这是一个问题,警告让你关闭DEFAULTLIB选项的建议是非常糟糕。相反,找出冲突的来源并解决它。我好几年没用过MS的工具了,所以我不能给你详细说明哪个工具做了什么,但是有一个工具可以从目标文件中转储信息(也许是objdump
?),并且正确的选项,可以为您提供嵌入在每个目标文件中的库信息。反过来,这会将您指向导致问题的目标文件。然后你必须弄清楚为什么它认为它需要那个版本;这通常是编译时使用的编译器选项的结果。因此,例如,如果一个目标文件构建为多线程而另一个构建为单线程,则会发生这样的冲突。你不能忽视它;如果应用程序使用多个线程并且链接器被拉入单线程库而不是多线程库,则会在未正确同步的函数中发生神秘的崩溃。
答案 1 :(得分:1)
如果构建正确,你就没事了。
危险在于libcmt
定义了一些函数,这些函数也是由您正在使用的其他库定义的。在这种情况下,您将获得错误(在链接时),表示符号是多重定义的。但是,如果它构建没有错误,那么生成的可执行文件应该没问题。