3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
vc \ lib中有4個(gè)版本的CRT鏈接庫:
libcmt.lib:發(fā)布版本的靜態(tài)CRT鏈接庫(/ MT)
libcmtd.lib:用于調(diào)試版本的靜態(tài)CRT鏈接庫(/ MTd)
msvcrt.lib:CRT版本DLL版本的導(dǎo)入庫(/ MD)
msvcrtd.lib:CRT調(diào)試DLL版本的導(dǎo)入庫(/ MDd)
查看鏈接器選項(xiàng),Project + Properties,Linker,Command Line。請(qǐng)注意這里沒有提到這些庫。鏈接器自動(dòng)確定編譯器使用了什么/ M開關(guān),以及哪個(gè).lib應(yīng)通過#pragma comment指令鏈接。有點(diǎn)重要的是,如果/ M選項(xiàng)與您鏈接的.lib之間存在不匹配,則會(huì)出現(xiàn)可怕的鏈接錯(cuò)誤并難以診斷運(yùn)行時(shí)錯(cuò)誤。
當(dāng)鏈接器被告知鏈接到msvcrt.lib 和 libcmt.lib 時(shí),您將看到引用的錯(cuò)誤消息。如果將使用/ MT編譯的代碼與使用/ MD鏈接的代碼鏈接,將會(huì)發(fā)生這種情況。CRT只能有一個(gè)版本。
/ NODEFAULTLIB告訴鏈接器忽略從/ MT編譯代碼生成的#pragma comment指令。這可能有效,盡管其他一些鏈接器錯(cuò)誤并不少見。像errno這樣的東西,它是靜態(tài)CRT版本中的extern int,但是對(duì)DLL版本中的函數(shù)進(jìn)行宏編輯。許多其他人喜歡這樣。
好吧,正確的方法修復(fù)此問題,找到您使用錯(cuò)誤的/ M選項(xiàng)編譯的鏈接的.obj或.lib文件。如果你沒有線索,那么你可以通過點(diǎn)擊.obj / .lib文件來找到它/“MT”
順便說一句:Windows可執(zhí)行文件(如version.dll)有自己的CRT版本來完成他們的工作。它位于c:\ windows \ system32,您無法可靠地將它用于您自己的程序,其CRT標(biāo)頭在任何地方都無法使用。程序使用的CRT DLL具有不同的名稱(如msvcrt90.dll)。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
來自Yochai Timmer的 IMO 這個(gè)鏈接非常好,相關(guān)但很難閱讀。我寫了一個(gè)總結(jié)。
Yochai,如果您讀過這篇文章,請(qǐng)參閱最后的說明。
對(duì)于原始帖子讀?。?a >警告LNK4098:defaultlib“LIBCD”與使用其他庫沖突
錯(cuò)誤
鏈接:警告LNK4098:defaultlib“LIBCD”與其他庫的使用沖突; 使用/ NODEFAULTLIB:庫
含義
系統(tǒng)的一部分被編譯為使用單線程標(biāo)準(zhǔn)(libc)庫與調(diào)試信息(libcd)靜態(tài)鏈接
而系統(tǒng)的另一部分被編譯為使用多線程標(biāo)準(zhǔn)庫而沒有調(diào)試信息,這些信息駐留在DLL中并使用動(dòng)態(tài)鏈接
如何解決
忽略警告,畢竟它只是一個(gè)警告。但是,您的程序現(xiàn)在包含多個(gè)相同功能的實(shí)例。
使用鏈接器選項(xiàng)/ NODEFAULTLIB:lib。這不是一個(gè)完整的解決方案,即使你可以讓你的程序以這種方式鏈接你忽略了一個(gè)警告標(biāo)志:代碼已經(jīng)針對(duì)不同的環(huán)境進(jìn)行了編譯,你的一些代碼可能被編譯為單線程模型,而其他代碼則是多線程。
[...]瀏覽所有庫并確保它們具有正確的鏈接設(shè)置
在后者中,正如原始帖子中提到的那樣,可能會(huì)出現(xiàn)兩個(gè)常見問題:
您有第三方庫,其鏈接與您的應(yīng)用程序不同。
您的代碼中嵌入了其他指令:通常這是MFC。如果系統(tǒng)中的任何模塊與MFC鏈接,則所有模塊必須名義上鏈接到相同版本的MFC。
對(duì)于這些情況,請(qǐng)確保您了解問題并在解決方案中做出決定。
- 3 回答
- 0 關(guān)注
- 1066 瀏覽
添加回答
舉報(bào)