2010-10-07 65 views
4

我的Visual Studio集成下的第三方代码到我的MFC应用程序2010
在调试模式下发生以下生成错误:Visual Studio中 - 错误LNK2005在调试模式下

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)" ([email protected]@[email protected]) 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)" ([email protected]@[email protected]) 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我能以完成构建有两种方式:

  • 在释放模式
  • 在调试模式下使用/ FORCE:MULTIPLE作为附加器命令行选项

在第二种情况下(调试模式),仍有许多警告报告。如果我还添加/ NODEFAULTLIB:LIBCMT大部分都不见了。

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

回答

10

出于某种原因,您正在链接LIBCMT和LIBCMTD(调试版本)。 (从阅读每条错误行的末尾:already defined in libcmtd.lib(invarg.obj)

您正在通过说/ NODEFAULTLIB:LIBCMT来解决正确的问题。您要链接的第三方库上的调试/发布标志是否与您的应用程序构建中的调试/发布模式相匹配?我猜想第三方代码以某种方式拉入冗余库。

+0

我有大部分第三方软件包的代码。我在哪里可以找到那里的调试/释放标志?它可能在一个编译的DLL我可能与包? – Jonathan 2010-10-08 16:12:53

0

如果幸运的话,您的第三方软件包包含一个xxx.lib以及一个xxxD.lib,就像LIBCMT一样。然后,您只需根据发布/调试链接适当的一个。 在类似情况下为我工作。

0

我这样解决了同样的问题: 在Solution Explorer> Configuration Parameters> C/C++> Code Generation中。 在运行时库字段中,选择....对于我的“第三方代码”,我必须选择多线程(/ MTd)并且它工作正常。

相关问题