glog測試時鏈接異常:LNK4042: 對象被多次指定;已忽略多余的指定(VS2010)


參考: 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

        ...

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM