問題:創建預編譯頭 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。
<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. 只有頭文件如何編譯呢?
- // stdafx.cpp : 只包括標准包含文件的源文件
- // TurnRound.pch 將作為預編譯頭
- // stdafx.obj 將包含預編譯類型信息
- #include "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中添加代碼
- #include "stdafx.h"
(2)第二步,右擊工程屬性=》配置屬性=》c/c++ =》預編譯頭,選擇使用預編頭, "預編譯頭文件"項 填寫 stdafx.h。
(3)第三步,右擊stdafx.cpp文件 -》選中屬性,配置屬性=》c/c++ =》預編譯頭,選擇創建預編譯頭,"預編譯頭文件"項 填寫 stdafx.h。