3 回答

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

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