關於 VS 2010 和 VS 2013 的警告 LNK4042

關於 VS 2010 和 VS 2013 的警告 LNK4042

由於我最近調整了一下 Jimi 的文件結構,導致出現了一個 LNK4042 的 warning,我並沒有很重視,這個 warning 導致出現了一些錯誤。

我調試了幾個小時,一開始並沒有想到是這個 warning 造成的,以爲是我改代碼改出來的問題(因爲最近做了大量調整),特此記錄一下。

 

我在調整代碼結構的時候,出現了這麼兩個文件 assert.cpp 和 assert.c,之前分別叫 jimi_assert.cpp 和 jimic_assert.c,所以相安無事,

沒有出現這個問題。而且由於是定義的 assert 函數,所以這個問題在 Release 版下不會有問題,在編譯 Debug 版的時候纔會出現,提示如下:

 

1>G:\Project\OpenSrc\Jimi_Root\Jimi\gen\tmp\vc2013\Jimi_static\x86-Debug\assert.obj : warning LNK4042: 對象被多次指定;已忽略多餘的指定

 

這會導致下面這個錯誤:

wKioL1dP1cDCv9stAAA1B9tM8QM254.png

 

這是 C 裏用到的 jimic_assert() 的鏈接錯誤,有時候,還會報 C++ 裏的 jimi::assertion_failure() 的鏈接錯誤,

即 jimi_assert(),這兩個錯誤出現的機率有一定隨機性(只會出現一個),所以也導致我調試了幾個小時……。

 

我們來 Google 一下 “LNK 4042”,查到一箇中文的:VS2010 警告 LNK4042 截圖如下:

wKiom1dP1O3hqwKaAABEaLGFWUk199.png

 

試了一下,沒解決問題,繼續搜,在 stackoverflow 上找到了  Visual Studio 2010's strange “warning LNK4042” ,

還有 MSDN: Linker Tools Warning LNK4042 裏提到的: Visual Studio 2010 & 2008 can't handle source files with identical names in different folders? ,

 

原來造成這個 warning 和錯誤的原因是:assert.c 和 assert.cpp 生成的 obj 文件名重疊了,導致編譯的時候只能鏈接其中一個,因爲另外一個可能被覆蓋掉了。

 

最簡單的解決辦法就是讓兩個文件的文件名不一樣,我把 assert.c 改名爲 assert-c.c 就解決了。

 

但是有些時候的確是有可能源文件的文件名重名的,這種方法不能一勞永逸,這個問題是因爲默認所有的 obj 都生成到同一個文件夾裏,所以可以單獨的指定某個文件的 obj 生成路徑,這樣就不會被覆蓋了。在VS裏選定你要改的文件,然後右鍵->點“屬性”,截圖如下:

wKioL1dP1iDyDbr5AADzVdN2_mw572.png

 

把 對象文件名 由:Obj$(IntDir) 改爲 Obj$(IntDir)\你想修改的路徑或obj文件名,例如上圖中的:Obj$(IntDir)\jimic_assert\ 或者 Obj$(IntDir)\jimic_assert.obj。

當然,想簡單一點,還是改文件名比較快。。。

 

如果還有什麼不懂的,可以去看看那兩個 stackoverflow.com 的帖子即可。

 【本文轉自:http://www.w2bc.com/Article/19023】


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章