2010-10-07 108 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)並且它工作正常。

相關問題