使用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ù)名稱有沖突,就會引起LNK2005錯(cuò)誤。微軟提供了兩套C運(yùn)行期函數(shù)庫,一種是普通的函數(shù)庫:LIBC.LIB,不支持多線程。另外一種是支持多線程的:msvcrt.lib。如果一個(gè)工程里,這兩種函數(shù)庫混合使用,可能會引起這個(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對此的解決方法是增加[/FORCE:MULTIPLE]連接選項(xiàng). 這方式發(fā)現(xiàn)會有警告,但可以編譯通過:
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" 該方法能編譯通過,并且沒有警告
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。