參考: http://blog.csdn.net/wangshubo1989/article/details/50706480
在測試glog日志庫時,我使用的環境是Win7 + VS2010。出現同一個工程多次編譯 偶爾出現 “LNK4042: 對象被多次指定;已忽略多余的指定” 的提示,偶爾編譯又正常的現象。
參考下面的文章才解決。
1,使用背景
MFC工程中引用glog庫,由於需要較大的靈活性,很多地方需要在原來的基礎上修改。所以不采用引用libglob.lib的方式,而是把整個源文件大部分包含進工程,參與編譯。
2,原理分析
參考的文章中有說,如果我們在工程中引入三方庫源文件。這樣有可能出現相同名字的文件,這樣如果目錄包含不清晰(多次包含),編譯器會出現警告: warning LNK4042: 對象被多次指定;已忽略多余的指定
這個問題和平時常見的頭文件保護不一樣! 舉個例子,你自己定義一個file.cc文件,里面實現了一些函數方法,比如你寫了一個函數獲取文件的路徑:GetFilePath();這個時候,你引入了一個 第三方庫,而且為了方便調試,你引入了源碼。而這個庫也包含一個名為file.cc的文件。這個時候,build的時候,出現了上面的警告。再編譯你自己寫的file.cc的時候就會出現錯誤了:
error LNK2001: 無法解析的外部符號
就是因為這個警告,忽略了多余的指定。
3,解決方法
項目上 右鍵 -> 屬性 -> C/C++ -> 輸出文件 -> 對象文件名 改為:
$(IntDir)/%(RelativeDir)/
這樣在編譯時工程路徑下出現各個庫的相對路徑下.obj文件。
-project
-Debug
-Lib1(編譯時中間文件目錄)
-Lib2(編譯時中間文件目錄)
...
一個改進的方法
上述設置$(IntDir)/%(RelativeDir)/ 雖然解決了問題,但編譯時產生的目錄信息不夠工整,於是采用以下方法,讓所有編譯時的中間文件都到一個目錄中去。
$(IntDir)/Obj/%(RelativeDir)/ 這樣產生的路徑是這樣的。
-Project
-Debug
-Obj
-Lib1
-Lib2
...