我正在将第三方代码集成到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
使用this advice我能够以两种方式完成构建:
在第二种情况下(调试模式),仍会报告许多警告。如果我还添加/ NODEFAULTLIB:LIBCMT,其中大部分都已消失。
这是什么原因?
我该如何解决这个问题,而不是解决这个问题?
答案 0 :(得分:11)
出于某种原因,您要链接LIBCMT和LIBCMTD(调试版本)。 (从阅读每个错误行的末尾开始:already defined in libcmtd.lib(invarg.obj)
)
你正在通过说/ NODEFAULTLIB:LIBCMT来修复正确的事情。您链接的第三方库上的调试/发布标志是否与应用程序构建的调试/发布模式匹配?我猜想第三方代码会以某种方式引入冗余库。
答案 1 :(得分:0)
如果你很幸运,你的第三方软件包包含一个xxx.lib以及一个xxxD.lib,就像LIBCMT一样。然后你只需要根据发布/调试链接适当的一个。 在类似的情况下为我工作。
答案 2 :(得分:0)
我这样解决了同样的问题: 在解决方案资源管理器中>配置参数> C / C ++>代码生成。 在运行时库字段中,选择....为我的“第三方代码”我必须选择多线程(/ MTd)并且它工作。