2010-11-21 59 views
3

我要問這個問題,然後自己回答。 我知道這是一個新手問題,但是因爲它花了我大約。兩天找到正確的答案,我會發布它。Visual Studio C++鏈接器警告:LNK4006與C運行時(CRT)

這麼多的免責條款 - 這一次是專門給你所有新手在那裏:

我必須繼續MFC項目在VS 2010中,我需要補充一些第三方靜態庫。一切進展順利,編譯了這兩個項目,並且我的項目成功引用了該庫。然後,當我在我的項目中包含庫中的一些頭文件時,我收到了大量鏈接器警告,其中包含有關C運行時庫中的函數的信息,例如:

警告9警告LNK4006:_sprintf已在libcmtd中定義。 LIB(sprintf.obj);第二個定義被忽略C:路徑\爲\我的\項目\ MSVCRTD.LIB(MSVCR100D.dll)

思考「什麼是地獄」,我試圖運行我的項目,才運行,直到它遇到了一個碼嘗試使用'fostream'寫入某個文件的行,然後崩潰,出現一些可怕的堆損壞異常。

搜索SO,我遇到了一些相關的問題,其中沒有一個完全符合我的問題:

我幾乎包裹外部庫在DLL中,前我偶然發現了答案。

回答

5

我的幸福結局是,我偶然發現了Microsoft支持文章中的正確答案:How to link with the correct C Run-Time (CRT) library

顯然,我違反了以下規則,如articel說:

可重用的庫和所有其用戶應使用相同的CRT庫類型,因此相同的編譯器開關。

這意味着我應該爲項目和第三方庫使用相同的C運行時(CRT)庫。在VS 2010中選擇CRT可以通過以下方式完成:右鍵單擊project_name - >屬性(屬性窗口打開) - > C/C++ - >代碼生成 - >運行時庫。根據文章中的表格(單線程,靜態多線程或dll多線程,發行或調試),使用下拉列表並選擇運行時庫。

配置完所有項目後,重新編譯它們,並且(希望)警告消失。