使用VC編程中經(jīng)常能遇到LNK2005錯(cuò)誤——重復(fù)定義錯(cuò)誤,其實(shí)LNK2005錯(cuò)誤并不是一個(gè)很難解決的錯(cuò)誤,。弄清楚它形成的原因,,就可以輕松解決它了。 出現(xiàn)LNK2005錯(cuò)誤有多種原因: 1.重復(fù)定義全局變量,。 2.頭文件的包含重復(fù)。 3.使用第三方的庫造成的,。 這里只討論使用第三方的庫造成的原因的處理,。如果在程序中同時(shí)使用了多個(gè)函數(shù)庫,,并且這些函數(shù)庫中有些函數(shù)名稱有沖突,,就會(huì)引起LNK2005錯(cuò)誤,。微軟 提供了兩套C運(yùn)行期函數(shù)庫,,一種是普通的函數(shù)庫:LIBC.LIB,,不支持多線程,。另外一種是支持多線程的:msvcrt.lib,。如果一個(gè)工程里,,這兩 種函數(shù)庫混合使用,,可能會(huì)引起這個(gè)LNK2005錯(cuò)誤,,一般情況下它需要MFC的庫先于普通運(yùn)行期函數(shù)庫被連接,,因此建議使用支持多線程的 msvcrt.lib,。 通常是盡量避免這樣混合使用兩套函數(shù)庫(LIBC.lib和MSVCRT.lib),。如果不得不同時(shí)使用兩套函數(shù)庫或者其它相互有沖突的函數(shù)庫,,可以嘗試按下面所說的方法: 在編譯包含zlib庫文件的時(shí)候,出現(xiàn)以下錯(cuò)誤: Linking... MSVCRT.lib(MSVCRT.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj) MSVCRT.lib(MSVCRT.dll) : error LNK2005: _sprintf already defined in LIBCD.lib(sprintf.obj) MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in LIBCD.lib(fclose.obj) MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free already defined in LIBCD.lib(dbgheap.obj) MSVCRT.lib(MSVCRT.dll) : error LNK2005: __vsnprintf already defined in LIBCD.lib(vsnprint.obj) MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fflush already defined in LIBCD.lib(fflush.obj) LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library Debug/Test.exe : fatal error LNK1169: one or more multiply defined symbols found 產(chǎn)生的原因是一個(gè)函數(shù)在兩個(gè)不同的Lib中都有導(dǎo)出(MSVCRTD和LIBC有沖突),有兩種辦法處理: 方法一: MSDN對(duì)此的解決方法是增加[/FORCE:MULTIPLE]連接選項(xiàng). 這方式發(fā)現(xiàn)會(huì)有警告,但可以編譯通過: LINK : warning LNK4075: ignoring /INCREMENTAL due to /FORCE specification MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _malloc already defined in LIBCD.lib(dbgheap.obj); second definition ignored MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _sprintf already defined in LIBCD.lib(sprintf.obj); second definition ignored MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _fclose already defined in LIBCD.lib(fclose.obj); second definition ignored MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _free already defined in LIBCD.lib(dbgheap.obj); second definition ignored MSVCRT.lib(MSVCRT.dll) : warning LNK4006: __vsnprintf already defined in LIBCD.lib(vsnprint.obj); second definition ignored MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _fflush already defined in LIBCD.lib(fflush.obj); second definition ignored LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library 方法二:添加鏈接選項(xiàng):/NODEFAULTLIB:<library> 如:/nodefaultlib:"libcd.lib" 該方法能編譯通過,,并且沒有警告 |
|