2007年2月28日 星期三

Linker Tools Error LNK2005

vs2005pe.PNG
Link error 2005 是我遇過最難搞的...
網路上也有一大堆資料..
但真正有幫助的卻寥寥無幾..

尤其是使用 MFC、ATL最常遇到...
因為有先後順序,而導致是定義衝突的問題
不論 MSDN 或 GOOGLE 上都有說明
但實在幫助甚少...

[code]uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)[/code]

最後,只好使用 LINKER 的參數 "/FORCE:MULTIPLE"
來規避問題,雖然 AP 執行起來沒什麼問題
但卻感覺有點不求甚解,待有空再來研究了..
把這個參數加入後,會有一些警告...

[code]uafxcw.lib(afxmem.obj) : warning LNK4006: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj); second definition ignored[/code]

參考資料:
"LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries" (Q148652)
"Global Overloaded Delete Operator Causes LNK2005" (Q140440)
"LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT" (Q184235).

2 則留言:

  1. 通常會出現 LNK2005, 是因為 build release 的執行檔, 可是確有 link 到了 debug 版的 libary, 也許是第三方的 libary 做怪也不一定,
    而 LNK4006 則是相反, build debug, link 到 release 的 libary

    回覆刪除
  2. 嗯嗯.. 這個錯誤是這回用 VS2005 寫 UNICODE 才碰到的,以前也沒碰過。
    一個很怪的問題,我是全 SOURCE 不論是 REL OR DEB 都會有問題.. 昏.. Orz
    不過,這回只出現在 NEW & DELETE .. 應該是還好.. 但也怕.. 會不會不同而做了不同的事啊... Orz

    回覆刪除