Visual Studio - 在调试模式下出现LNK2005错误

5

我正在将第三方代码集成到我的Visual Studio 2010的MFC应用程序中。
在调试模式下会出现以下构建错误:

1>LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in libcmtd.lib(invarg.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>D:\My Documents\Dev\MyProject\MyProject\Debug\MyProject.exe : fatal error LNK1169: one or more multiply defined symbols found

使用这个建议,我能够以两种方式完成构建:

  • 在发布模式下
  • 在调试模式下使用/FORCE:MULTIPLE作为附加的链接器命令行选项

在第二种情况(调试模式)中,仍然报告了许多警告。如果我还添加/NODEFAULTLIB:LIBCMT,大部分警告都将消失。

这是什么原因?
我该如何解决这个问题,而不是绕过它?

3个回答

12

由于某种原因,您同时链接了LIBCMT和LIBCMTD(调试版本)。 (从每个错误行的结尾读取:already defined in libcmtd.lib(invarg.obj)

通过说出 /NODEFAULTLIB:LIBCMT,您正在修复正确的内容。您链接的第三方库的调试/发布标志是否与您应用程序构建的调试/发布模式匹配?我猜测第三方代码会以某种方式引入多余的库。


我有大部分第三方包的代码。我可以在哪里找到它们的debug/release标志?它可能在我拥有的已编译dll文件中吗? - Jonathan Livni

0
如果你很幸运,你的第三方包含了 xxx.lib 和 xxxD.lib,就像 LIBCMT 一样。那么你只需要根据 release/debug 链接适当的库就可以了。 在我遇到类似的情况时这个方法行得通。

0
我是这样解决同样的问题的: 在“解决方案资源管理器”>“配置参数”>“C/C++”>“代码生成”中。 在“运行时库”字段中,选择... 对于我的“第三方代码”,我必须选择多线程(/MTd),然后它就可以工作了。

还要注意的是,你使用的所有库中,这个标志应该是相等的。 - user2501323

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