vs2010 創建預編譯頭 Debug 正常 Release Link Error問題解決


問題:創建預編譯頭 Debug 正常 Release Link Error

Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已經在 BasicData.obj 中定義
warning C4727: 具有相同時間戳的名為 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在於 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Make3Dm.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一個 PCH。
Make3Dm.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已經在 BasicData.obj 中定義
warning C4727: 具有相同時間戳的名為 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在於 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\MakeBlkIdx.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一個 PCH。
MakeBlkIdx.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已經在 BasicData.obj 中定義
warning C4727: 具有相同時間戳的名為 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在於 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\MakeDtm.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一個 PCH。

.\..\..\..\bin\MakeMapData\MakeMapData.exe : fatal error LNK1169: 找到一個或多個多重定義的符號
 
項目的debug和release下的預編譯頭設置看起來都一樣。但是release下就是編譯不過,還報以上的錯誤。
 
在網上看到網上有人提到:“ 工程屬性里面設置的是使用哪個預編譯頭,但是預編譯頭的生成是在cpp文件的屬性里面設置的,右鍵點擊文件-屬性-C/C++-預編譯頭,保證只有一個cpp文件會生成預編譯頭。
 
當時沒怎么理解這句話的含義,不知道每個.cpp文件都可以設置預編譯頭。
 
后來通過對比正確版本、錯誤版本的.vcxproj文件,發現正確版本的文件 <ItemGroup>項下

<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
</ClCompile>,

而錯誤版本的

<ClCompile Include="stdafx.cpp">
</ClCompile> 沒有中間的兩項預編譯頭子項。

 

然后查看有關預編譯頭的相關介紹,知道了原來每個.cpp源文件都可以單獨設置預編譯頭選項(使用預編譯頭,還是創建編譯頭,或者不使用)

 

創建預編譯頭 Debug 正常 Release Link Error 處理方法

這個問題的原因是stdafx.cpp源文件的預編譯頭設置的選項問題。右鍵stdafx.cpp文件,選中屬性

發現這里的預編譯頭選項是“使用”,然后把預編譯頭的使用改成“創建”,然后重新編譯,編譯通過了。

 

下面轉一篇關於預編譯頭介紹的問題

預編譯頭就是將程序的頭文件部分編譯成一個二進制中間文件,提高整個工程的編譯效率,一般以.pch格式存儲。

 1. 在編譯器重已經采用了時間戳的方式,為何還需要預編頭呢?

        對.obj加以時間戳的方式,可以根據時間戳來決定哪些文件需要重新編譯,從而提高效率。但重新編譯這個文件,包括這個文件的頭文件里的信息和預處理(指頭文件中的預處理)都重新進行一遍,而預編譯頭正是解決了這個問題,將穩定的頭文件內容預先編譯為一個二進制中間文件。

 

2. 只有頭文件如何編譯呢?

        編譯器無法直接編譯頭文件,那么就需要一個CPP和結合頭文件一起編譯,這樣就是為什么通常MFC工程中存在一個StdAfx.cpp,其內容僅僅顯示:
[cpp]  view plain  copy
 
  1. // stdafx.cpp : 只包括標准包含文件的源文件  
  2. // TurnRound.pch 將作為預編譯頭  
  3. // stdafx.obj 將包含預編譯類型信息  
  4.   
  5. #include "stdafx.h"  
        通常將常用的頭文件都放到stdafx.h頭文件中。

      3. fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h" to your source?

         在MFC中編程中最常見不過的了,因為MFC工程默認采用了預編譯頭,之后必須在.cpp文件頭部包含stdafx.h(注意一定要放在頭部,不然前面的頭文件會被忽略);右擊我們出錯的的文件可以找到證據:

                    

           如果你關閉預編譯頭,可以發現沒有了這個error。但既然預編譯頭帶來這么多好處,為何不使用呢?

4. 創建屬於自己的預編頭(本人采用VS2005)

           (1)第一步,創建stdafx.h 和 stdafx.cpp, 將常用的頭文件放入stdafx.h中(一般選擇穩定的頭文件,因為編譯產生預編譯頭時間比較長),在stdafx.cpp中添加代碼

 

[cpp]  view plain  copy
 
  1. #include "stdafx.h"  

          (2)第二步,右擊工程屬性=》配置屬性=》c/c++ =》預編譯頭,選擇使用預編頭, "預編譯頭文件"項 填寫 stdafx.h。

 

          (3)第三步,右擊stdafx.cpp文件 -》選中屬性,配置屬性=》c/c++ =》預編譯頭,選擇創建預編譯頭,"預編譯頭文件"項 填寫 stdafx.h。


免責聲明!

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



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