VC中預設庫衝突的解決

2021-08-22 01:20:51 字數 877 閱讀 7410

vc在編譯程式時有兩個習慣:

1、在從頭開始編譯時(即生成makefile時),將源檔名按字母排序後,依次處理;

2、一邊編譯一邊決定需要哪些預設庫。 它的這些習慣有時會造成奇怪的編譯錯誤,例如專案中有兩個檔案:

charutil.c

gbuni.cpp

其中gbnni.cpp用到了mfc庫。

編譯器先處理charutil.c,然後覺得需要link乙個c runtime庫,根據專案設定選擇了libcmtd.lib。

然後又處理gbnni.cpp,因為要用mfc,又決定要link nafxcwd.lib。

最後link的時候,就會出現以下衝突:

nafxcwd.lib(afxmem.obj) : error lnk2005: "void __cdecl operator delete(void *)" (??3@yaxpax@z) already defined in libcmtd.lib(dbgdel.obj)

其實,如果先link nafxcwd.lib,再link libcmtd.lib,就不會產生衝突。

解決這類問題有兩個辦法。

1、將需要link c runtime庫的檔案(charutil.c)的名字改大一些,讓它排在後面。

2、在settings->link->input的objects/library modules中設定nafxcwd.lib libcmtd.lib,即指定庫的順序。也可以順利編譯。

總結一下:在發生預設庫衝突時,可以通過手工設定預設庫的順序來解決,正確的順序應該是:

mfc庫、crt動態鏈結版本的導入庫、crt靜態庫。

crt是c runtime庫的縮寫。

關於link過程更詳細的介紹可以參見我從這篇文章中受益良多,感謝作者soloist。

VC預設鏈結庫衝突

在同乙個專案中,所有的原始檔必須鏈結相同的c執行時庫。如果某一檔案用了multithreaded dll版本,而其他檔案用了single threaded或者multithreaded版本的庫,也就是說用了不同的庫,就會導致這個警告的出現。總之,一句話,lib之間有衝突。需要刪除匯入的一些 libs...

SVN中衝突的解決

本人使用svn的時間不是很長,在使用之前也僅僅是粗淺的了解過這個軟體。從今年的8月份開始,由於乙個專案使用eclipse 3.1,跨地域的開發,為了適應不同的開發人員處於不同的地理位置,因此我們使用svn作為團隊開發的管理工具。開始使用時,僅僅是邊學邊用,遇到不懂的地方再去查詢資料。今天由於有點時間...

svn中衝突的解決

可以使用svn status u命令來檢視一下某個問題是否會有衝突發生。在使用svn update 的時候,會出現如下一些資訊 svn update u install g readme c bar.c updated to revision 46.那麼,u 開頭的資訊提示你,這個檔案在你本地沒有修...