參考資料:性能
http://blog.csdn.net/laogaoav/article/details/8544880優化
http://stackoverflow.com/questions/18612072/link-warning-lnk4098-defaultlib-msvcrt-conflicts-with-use-of-other-libs-usspa
正文:.net
爲了看這個 錯誤是怎麼出來的,首先建立一個Win32工程:新建->項目->Win32項目->下一步->靜態庫->取名爲ADDLIB命令行
好,添加一個類,以下code
// 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->肯定blog
接着,生成解決方案,如今你在項目文件夾的Release子文件夾中能夠找到ADDLIB.libit
如今,打開另外一個項目,選擇:項目->屬性->VC++目錄->包含目錄->把Adder.h的路徑添加進去,而後選擇:庫目錄->把ADDLIB.lib的路徑添加進去(即$(ADDLIB_PATH)\Debug\ADDLIB.lib,其中$(ADDLIB_PATH)是你的項目根目錄),而後選擇:連接器->輸入->附加依賴項->把ADDLIB.lib添加進去io
好如今寫一段代碼使用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的版本,並且在使用的時候必定要匹配上。才能儘量避免這種問題。若是仍是出現了相似問題,按照上面的思路去查找源頭並修改你的配置便可。