2010-07-08 61 views
5

當鏈接我的發佈版本的DLL,我得到 -VC++/DEFAULTLIB問題

1> LINK:警告LNK4098:defaultlib 'mfc80d.lib' 與使用其他 庫衝突;使用/ NODEFAULTLIB:庫

1> LINK:警告LNK4098:defaultlib 'mfcs80d.lib' 與使用其他 庫衝突;使用/ NODEFAULTLIB:庫

1> LINK:警告LNK4098:defaultlib 'msvcrtd.lib'與其他庫的使用衝突 ;使用/ NODEFAULTLIB:庫

添加/冗長,我看到下面的(片段): ...

1>搜索d:\微軟的Visual Studio的 8 \ VC \ atlmfc \ LIB \ mfc80d.lib:

1> 找到 「公共:虛擬__thiscall AFX_MODULE_STATE ::〜AFX_MODULE_STATE(無效)」 (?? 1AFX_MODULE_STATE @@ @ UAE XZ)1>
在mfcs80.lib引用(dllmodul .OBJ ) 1>加載 mfc80d.lib(MFC80D.DLL)

1>找到 「長STDCALL AfxWndProc(結構HWND__ *,無符號 整型,無符號整型,長)」 (?AfxWndProc @@ YGJPAUHWND __ @@ IIJ @ Z)

1> 在mfcs80.lib引用(dllmodul.obj) 1>加載 mfc80d.lib(MFC80D.DLL)

...

如果我正確解釋它,這意味着鏈接器以某種方式解析來自(優化)庫mfcs80的調用,作爲調用(非優化)庫mfc80D的調用。怎麼會這樣??

當我添加/NODEFAULTLIB:mfc80d.lib警告消失了,但我還沒有安靜。順便說一句,該模塊的增量鏈接確實遭受了零星的無法解釋的崩潰,只能通過重新構建來解決。我正在使用VS2005。

[編輯]將標題更改爲包含DEFAULTLIB,希望更好地將主題聚焦。我看到一個明確的行話說

處理/DEFAULTLIB:mfc80d.lib

在/ VERBOSE輸出

,許多其他(非調試)默認庫中。它從何而來?我怎樣才能解決這個問題?

謝謝!

回答

2

這個問題後來得到解決 - 我將它張貼在這裏,以防某天有助於某人。

原來是一個錯誤的預編譯頭文件路徑:釋放配置指向默認的調試PCH路徑。因此,在從調試到發佈的轉換中,構建會拖入所有調試PCH內容 - 顯然包括MFC#pragma(註釋「lib ..」)(包含在afx頭文件中)的一些調試版本。一個乾淨的版本會正確地重建PCH,但是再次進入調試文件夾 - 從而在轉換回調試版本時產生相同的問題。

2

您應該檢查項目的運行時庫設置,聽起來像是不匹配。在根據C/C++>代碼生成>運行時庫,您可以選擇您的項目設置:

  • 多線程
  • 多線程調試
  • 多線程DLL
  • 多線程調試DLL

聽起來像您的解決方案中的一些項目可能使用調試版本,而其他人使用非調試版本。或者,某些項目可能使用Debug版本,而其他項目則使用Debug DLL版本。對於給定的解決方案配置,您希望所有項目都使用相同的設置。

+0

感謝 - 但我檢查了所有項目(和所有個人文件),而且都用/ MD編譯。我有很少的外部依賴項:version.dll,shlwapi.dll和第三方組件,我使用dependency-walker進行了檢查,並且似乎與正確的CRT版本(非調試版)鏈接。/MD交換機是否是對/ DEFAULTLIB交換機的唯一訪問?沒有其他輸入可能會把它搞砸嗎? – 2010-07-08 14:57:14

0

這意味着其中一個依賴dll被編譯爲不同的run-time library

項目 - >屬性 - > C/C++ - >代碼Generaion之 - >運行時庫

去了所有的圖書館,看到他們以同樣的方式進行編譯。

更多關於此錯誤在此鏈接:

warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs

+0

正如我評論@ bshields(相同)的答案,我檢查之前發佈在這裏。請參閱我自己的(〜1年以後)最終問題來源的答案。 – 2011-04-12 07:24:39