參考資料:
http://blog.csdn.net/laogaoav/article/details/8544880
http://stackoverflow.com/questions/18612072/link-warning-lnk4098-defaultlib-msvcrt-conflicts-with-use-of-other-libs-us
正文:
為了看這個 錯誤是怎么出來的,首先創建一個Win32工程:新建->項目->Win32項目->下一步->靜態庫->取名為ADDLIB
好,添加一個類,如下
// Adder.h #pragma once class Adder { int x, y; public: Adder(int x, int y); int result(); }; // ---------------------------------- // Adder.cpp #include "Adder.h" Adder::Adder(int xx, int yy) :x(xx), y(yy) { } int Adder::result() { return x + y; }
好,選擇:生成->配置管理器->Release->確定
接着,生成解決方案,現在你在項目文件夾的Release子文件夾中可以找到ADDLIB.lib
現在,打開另一個項目,選擇:項目->屬性->VC++目錄->包含目錄->把Adder.h的路徑添加進去,然后選擇:庫目錄->把ADDLIB.lib的路徑添加進去(即$(ADDLIB_PATH)\Debug\ADDLIB.lib,其中$(ADDLIB_PATH)是你的項目根目錄),然后選擇:鏈接器->輸入->附加依賴項->把ADDLIB.lib添加進去
好現在寫一段代碼使用Adder,例如
Adder a(1,2); int x = a.result();
首先確保這個項目是Debug配置,生成解決方案,報錯如下:
1> ADDLIB.lib(Adder.obj) : 找到 MSIL .netmodule 或使用 /GL 編譯的模塊;正在使用 /LTCG 重新啟動鏈接;將 /LTCG 添加到鏈接命令行以改進鏈接器性能
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由於“/LTCG”規范)
1>MainWindow.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由於“/OPT:LBR”規范)
1>LINK : warning LNK4098: 默認庫“MSVCRT”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library
看到這里,有經驗的話,細心一點就可以看出來,就是因為Debug版本的項目去鏈接Release版本的 static庫造成的錯誤,所以解決方案就是回到 ADDLIB項目,構建一個Debug版本的ADDLIB.lib,然后這邊 Debug的 時候就用Debug\ADDLIB.lib,在Release的時候才用Release\ADDLIB.lib
具體為什么是這樣 報錯呢,很簡單,去項目屬性里面查看就知道了,Debug配置的時候,C/C++ -> 優化,這個配置項里面“全程序優化”的默認選項是“否”,但是在Release配置的 時候,是“是/GL”,由於不匹配,所以報錯。同樣的,對於C/C++ -> 代碼生成,這個配置項里面“運行庫”在Debug配置下默認是/MDd,但是在Release下默認是/MD,同樣由於不匹配,報錯。
所以堅持一個原則,無論是構建lib文件還是DLL文件,一定既要Debug的版本,也要Release的版本,而且在使用的時候一定要匹配上。才能盡可能避免這種問題。如果還是出現了類似問題,按照上面的思路去查找源頭並修改你的配置即可。