vs常見鏈接錯誤問題


1、link error 1104

原因:當從vc6移植到.net時,會導致這個鏈接錯誤!

解決:項目屬性->配置屬性->鏈接器->輸入->忽略特定庫,加入libcd.lib;或直接在命令行中加入: /NODEFAULTLIB:"libcd.lib"

注意:是否是libcd.lib,與C/C++屬性中的“代碼生成”選項相關

單線程 (libc.lib) 

多線程 (libcmt.lib) 

使用 DLL 的多線程 (msvcrt.lib) 

調試單線程 (libcd.lib) 

調試多線程 (libcmtd.lib) 

使用 DLL 的調試多線程 (msvcrtd.lib) 

2、LINK : warning LNK4098: 默認庫“LIBCMTD”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library

原因:VS2008,項目——屬性——配置屬性——C/C++——代碼生成:他有/MT,/MTd,/Md,/MDd四個選項,你必須讓所有使用的庫都使用相同的配置,否則就會有相應的提示,甚至可能會出現無法解析的函數。

解決:將兩個項目的運行時庫統一。簡單的方式就是將項目的動態庫修改為使用Multithreaded DLL 版本的C運行時庫即可。 有時我們使用的庫不是自己可以控制的,那么就只能把工程屬性設置成河你使用的庫相同的選項。

 以前經常遇到這個警告信息,因為運行並沒有什么問題,所以也沒深究。但是耿耿於懷那個“ 0 個錯誤,0 個警告”的成功提示,在網上搜了一下。原來問題出在默認庫的引用選擇上。

 

VS2008,項目——屬性——配置屬性——C/C++——代碼生成:他有/MT,/MTd,/Md,/MDd四個選項,你必須讓所有使用的庫都使用相同的配置,否則就會有相應的提示,甚至可能會出現無法解析的函數。

有時我們使用的庫不是自己可以控制的,那么就只能把工程屬性設置成河你使用的庫相同的選項。

 

錯誤 1 error LNK2005: _free 已經在 libcmtd.lib(dbgheap.obj) 中定義         MSVCRT.lib

錯誤 2 error LNK2005: _malloc 已經在 libcmtd.lib(dbgheap.obj) 中定義     MSVCRT.lib

如果有一堆的重定義錯誤發生在同一個lib中,而且跟它沖突的也是同一個lib,那么這個兩個lib的功能應該是一樣的,可以2選一,只要在“忽略特定的庫”內填入需要忽略的庫。

項目屬性-配置屬性-鏈接器-輸入-忽略特定的庫:libcmtd.lib

項目屬性-配置屬性-常規-MFC的使用:在共享 DLL 中使用 MFC

MSVCRT.lib 和libcmt.lib的沖突還是比較常見的。

從錯誤信息可以看出是msvcrt.lib和libcmt.lib庫中重復定義了__isctype等符號。為什么會出現這樣的問題呢?這就要從這兩個庫的作用說起了。

msvcrt.lib是VC中的Multithreaded DLL 版本的C運行時庫,而libcmt.lib是Multithreaded的運行時庫。在同一個項目中,所有的源文件必須鏈接相同的C運行時庫。如果某一文 件用了Multithreaded DLL版本

,而其他文件用了Single-Threaded或者Multithreaded版本的庫,也就是說用了不同的庫,就會導致這個警告的出現。

告警信息的意思我們明白之后,就要找造成這個問題的原因了。在項目設置中我們可以看到當前項目使用的是Multithreaded非DLL版本的運 行時庫,這說明項目中還有其他文件用到了不是這個版本的運行時庫。很顯然,就是openssl的靜態庫。查看openssl中ms下的nt.mak,我們 可以發現靜態庫版本中openssl使用編譯開關/MD進行編譯的,也就是說openssl靜態庫是默認用的Multithreaded DLL 版本的C運行時庫。

原因找到了。那么解決方法,很明顯有兩個。總之就是將兩個項目的運行時庫統一。

簡單的方式就是將項目的動態庫修改為使用Multithreaded DLL 版本的C運行時庫即可。 某些情況下你的項目可能不能改變當前的運行時庫,你可以將openssl的nt.mak中的/MD開關修改為/MT然后重新編譯openssl靜態庫就可以了。

默認庫“library”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library LNK4098 的解決辦法

您試圖與不兼容的庫鏈接。
注意 運行時庫現在包含可防止混合不同類型的指令。如果試圖在同一個程序中使用不同類型的運行 時庫或使用調試和非調試版本的運行時庫,則將收到此警告。例如,如 果編譯一個文件以使用一種運行時庫,

而編譯另一個文件以使用另一種運行時庫(例如單線程運行時庫對多線程運行時庫),並試圖鏈接它們,則將得到此警告。應 將所有源文件編譯為使用同一個運行時庫。有關更多信息,請參見使用運行時庫(/MD、/MT 和 /LD)編譯器選項。
可以 使用鏈接器的 /VERBOSE:LIB 開關來確定鏈接器搜索的庫。如果收到 LNK4098,並想創建使用如單線程、非調試運行時庫的可執行文件,請使用 /VERBOSE:LIB 選項確定鏈接器搜索的庫。

鏈接器作為搜索的庫輸出的應是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。對每個要忽略的庫可以使用 /NODEFAULTLIB,以通知鏈接器忽略錯誤的運行時庫。
下表顯示根據要使用的運行時庫應忽略的庫。
若要使用第一行運行時庫    請忽略第2行的這些庫 單線程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多線程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多線程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
調試單線程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
調試多線程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的調試多線程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
例如,如果收到此警告,並希望創建使用非調試、單線程版本的運行時庫的可執行文件,可以將下列選項與鏈接器一起使用:
/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM