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 開頭的資訊提示你,這個檔案在你本地沒有修...