2010-11-26 66 views
0

我遇到了這個問題,雖然這是一個警告,但我懷疑是引擎蓋下出現問題的標誌。當我建立在釋放模式我得到這樣的警告:鏈接器警告C++ Visual Studio

MSVCRT.LIB(cinitexe.obj):警告LNK4098:defaultlib「MSVCRTD.LIB」與其他使用林達衝突;使用/ NODEFAULTLIB:庫

我在Visual Studio C++ Express Edition中構建了一個動態DLL。當我在調試模式下執行時,不會出現警告。我google了一下,它看起來像msvcrtmsvcrtd都是多線程的,一個用於調試,另一個不是。我可以使用/NODEFAULTLIBMSVCRT.lib,但我認爲避免症狀確實有助於解決問題。

我真的不知道這是一個很大的問題。正確生成DLL和.lib文件。

+1

發佈版本應該只包括`msvcrt.lib`而不是`msvcrtd.lib`。你確定你沒有添加錯誤的東西嗎? – casablanca 2010-11-26 18:14:30

回答

0

這是一個很大的問題,因爲它可能會導致應用程序發生許多意外的崩潰,而且由於您不允許分發Visual Studio的調試C++運行時,所以不能分發鏈接msvcrtd.lib的應用程序。 雖然/NODEFAULTLIB應該修復這些問題,但您應該自行解決問題。

像卡薩布蘭卡說的,msvcrtd.lib鏈接在發佈模式,但它應該只在調試模式下鏈接。 這並不意味着你自己的應用程序有錯誤的鏈接器設置。您在項目中使用的任何庫都可能具有不正確的設置。

我通常會解決這個問題的方法是,打開應用程序鏈接的所有文件.lib,並使用文本編輯器打開如此大的二進制文件(如SciTE),然後我搜索它們以查找例如。 VC80.DebugCRT(在這種情況下,VC80 == Visual Studio 2005),如果我在其中一個庫中找到此字符串,則應該使用/MD重新編譯該庫。

如果您正在鏈接動態庫,則可以在.dll文件上使用名爲Dependency Walker的工具,而不是手動搜索.lib文件。 如果Dependency Walker顯示了其中一個調試crt DLL文件(例如, MSVCP80D.dll(注意尾部D),使用/MD重新編譯該庫。

0

問題與您的圖書館有關。 它們與您的程序鏈接不同。

例如,您的程序可能是單線程的,而您的庫可能以多線程連接。

查找

Project Properties 
Configuration Properties 
C/C++ 
Code Generation 
Runtime Library 

下才能看到的設置(例如, 「多線程調試DLL(/ MDD)」)。

0

檢查您的運行時庫設置在項目的發佈配置中是否正確。基本上它應該與您的Debug版本相同,但在描述中沒有「調試」一詞。有關此問題的Visual Studio文檔是here

檢查您的設置如下:

    在Solution Explorer
  • 右鍵單擊該項目並選擇屬性
  • 確保配置(在屬性窗口的頂部)是Active (Release)
  • 去配置屬性 - > C/C++ - >代碼生成
  • 檢查Runtime Library for Release是否爲Debug版本的CRT。