最近修改乙個服務模組的時候,發現編譯的時候竟然出現lnk2005錯誤:
1>libcmt.lib(invarg.obj) : error lnk2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@yaxpbg00ii@z) 已經在 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)" (?_invoke_watson@@yaxpbg00ii@z) 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __call_reportfault 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __get_invalid_parameter_handler 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __initp_misc_invarg 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __invalid_parameter 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __invoke_watson 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: __set_invalid_parameter_handler 已經在 libcmtd.lib(invarg.obj) 中定義
1>libcmt.lib(invarg.obj) : error lnk2005: ___pinvalidarghandler 已經在 libcmtd.lib(invarg.obj) 中定義
1>link : warning lnk4098: 預設庫「libcmt」與其他庫的使用衝突;請使用 /nodefaultlib:library
1>.\debug\monfibclient.exe : fatal error lnk1169: 找到乙個或多個多重定義的符號
以前也曾多次遇到過,一般都是重複定義了一些全域性變數或者標頭檔案的重複包含等,這裡是另外乙個原因:呼叫第三方庫導致的。就是整個工程中不同的lib使用了不同的執行時庫(crt).
修改方法為:
或者使用如提示所示,project->settings->link->catagory選擇input,再在ignore libraries 的edit欄中填入忽略的庫,例如/nodefaultlib:『libcmtd.lib』
如果不行,可以在專案的**生成即project->settings->c/c++頁,catagory選擇code generation/user runtime libraray選擇其他執行時庫。
其中/mt代表 "multithread, static version 」,多執行緒靜態鏈結版本,編譯器把libcmt.lib 安置到obj檔案中,讓鏈結器使用libcmt.lib 處理外部符號;
/md代表 "multithread- and dll-specific version」,多執行緒動態鏈結版本,編譯器把msvcrt.lib 安置到obj檔案中,它連線到dll的方式是靜態鏈結,實際上工作的庫是msvcr80.dll;
而加不加『d』是為了區別debug版本和release版本。
只要保證整個工程的所有lib都使用相同的crt就可以了。
在本服務模組中,忽略庫並不能解決問題,將執行時庫改為/md後就可以了。
想到這種鏈結庫衝突的問題,其實本質上是在程式鏈結的過程中,同乙個外部符號在多處找到了強型別定義的衝突,但是實際上乙個專案往往涉及了很多的靜態庫和動態庫包括系統的和第三方的,所以排查的時候還是比較困難,有時候只能對所有的執行時庫一一嘗試,如果都不行,那再多的外部lib也需要一一檢查了。
ps:編譯時還出現了下面這個錯誤
error c1001: 編譯器中發生內部錯誤
這個一般是因為編譯器的版本問題,只需要清理一下專案然後全部重新生成基本就沒有問題了。
關於重複定義 LNK2005
有時候會見到同事寫的 中,標頭檔案一開啟就有如下格式 ifndef define 正文 endif 當時看不出有什麼意義,於是也就不明白為什麼這麼寫了,就這樣讓它做為乙個高階的存在放在記憶裡 今天它從神壇上掉了下來 原來它是意義僅僅是替換 pragma once,然而標頭檔案中都包含此句 omg 這...
使用hiredis報錯LNK2005
專案的db中使用了redis python mysql的儲存方案,在編譯redis庫的時候,win32 interop.lib與專案中原有的net.lib有編譯衝突,net.lib引用了ws2 32.lib,導致tcp的幾個介面bind accept 報重複定義的錯誤。解決方案 修改了redis的原...
我所遇到的LNK2005問題。
在寫數學庫時,很無奈的遇到莫名其妙的lnk2005錯誤 類似 aaa.obj error lnk2005 int book c book 3ha already defined in bbb.obj的一堆東西。說這些函式在另乙個只呼叫該函式的而壓根兒沒有定義的檔案裡已有定義,汗。看msdn只覺得一頭...