解決:warning LNK4098: 默認庫“MSVCRT”與其他庫的使用沖突;找到 MSIL .netmodule 或使用 /GL 編譯的模塊;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由於“/LTCG”規范)


參考資料:

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的版本,而且在使用的時候一定要匹配上。才能盡可能避免這種問題。如果還是出現了類似問題,按照上面的思路去查找源頭並修改你的配置即可。


免責聲明!

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



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