也許vc6也可以也說不定?
花了三小時在這個問題上,超想罵"x"的!
錯誤情況:
Release下
設StdOgre.h是預編譯頭檔
首先用/Yu錯誤是
1>StdOgre.cpp
1>.\StdOgre.cpp(5) : fatal error C1854: 無法覆寫在目的檔中先行編譯標頭檔建立期間形成的資訊: 'c:\users\damody\desktop\gp\ntust2010game\school_adventure\school_adventure\release\stdogre.obj'
/Yc的錯誤
1>warning C4727: 有相同時間戳記的 PCH 具名 c:\users\damody\desktop\gp\ntust2010game\school_adventure\school_adventure\release\school_adventure.pch 出現在 c:\Users\damody\Desktop\GP\ntust2010game\School_Adventure\School_Adventure\Release\SAFrameListener.obj 和 c:\Users\damody\Desktop\GP\ntust2010game\School_Adventure\School_Adventure\Release\main.obj 中。使用第一個 PCH。
1>SAFrameListener.obj : error LNK2005: ___@@_PchSym_@00@UfhvihUwznlwbUwvhpglkUtkUmgfhgCABAtznvUhxslloPzwevmgfivUhxslloPzwevmgfivUivovzhvUhgwltivOlyq@ 已在 main.obj 中定義過了
1>warning C4727: 有相同時間戳記的 PCH 具名 c:\users\damody\desktop\gp\ntust2010game\school_adventure\school_adventure\release\school_adventure.pch 出現在 c:\Users\damody\Desktop\GP\ntust2010game\School_Adventure\School_Adventure\Release\StdOgre.obj 和 c:\Users\damody\Desktop\GP\ntust2010game\School_Adventure\School_Adventure\Release\main.obj 中。使用第一個 PCH。
以下省略...
然後你可能有找過下列網頁
http://www.ogre3d.org/forums/viewtopic.php?p=152323&sid=e7b569352f6bf0f01f5ab7d923aad907
http://www.cnblogs.com/cgwolver/archive/2008/12/08/1350229.html
你會發現他根本在說廢話,說的跟MSDN沒差多少,完全不知道哪裡強大了。
接下來你會到MSDN查下列網頁
http://msdn.microsoft.com/en-us/library/ms235540%28VS.80%29.aspx
http://msdn.microsoft.com/en-us/library/7zc28563.aspx
http://msdn.microsoft.com/en-us/library/z0atkd6c.aspx
http://msdn.microsoft.com/en-us/library/21khx4ke%28v=VS.100%29.aspx
http://support.microsoft.com/kb/102697
http://msdn.microsoft.com/en-us/library/b4w02hte%28v=VS.71%29.aspx
http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/e2ff0adb-a27a-432b-9a83-bd9bc32583c8
發現沒有一篇是能解決你問題的,
最後發現大家心灰意冷加無奈鬱悶到只好用
http://hi.baidu.com/andriy_aolala/blog/item/00ef714e701b190db2de0560.html
這種不是方法的方法解決。

然後我終於知道在網路是這也許是前無古人公佈解決方法的好問題,
所以我建了一個新的專案,用了同樣的程式碼,奇怪的是這個新專案是OK編譯的!!?
所以就把命令列拿來比較,我把路徑都代換成C:\xxx\Release了

/O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /Gy /Yu"StdOgre.h" /Fp"Release\xxx.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
/O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /Gy /Yu"StdOgre.h" /Fp"Release\xxx.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
/OUT:"C:\xxx\Release\xxx.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\xxx.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\xxx\Release\xxx.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT OgreMain.lib OIS.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/OUT:"C:\xxx\Release\xxx.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\xxx.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"c:\xxx\Release\xxx.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT OgreMain.lib OIS.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

一模一樣QQ
保證不是命令列的問題,那為什麼會不一樣,
這時我發現了,新的OK專案每次都是從StdOgre開始編譯,舊專案則是隨機順序?
最後發現,在VC專案中的每一個CPP跟H都有個自的命令列,簡單來說任一一個.CPP跟.H的編譯方法可以不一樣,
發現StdOgre.cpp是用/Yc,專案則是用/Yu,馬上套到我的專案,立馬解決。

順帶一提,如果是debug編譯錯誤的話可以試試 /Yl"name.h" 中間不要空格,通常都會解決。
以下兩個選項易被忽略:
/Yd (Place Debug Information in Object File)
/YX (Automatic Use of Precompiled Headers)

然後為什麼要用預編譯呢?當然是因為我編譯快10倍,我超強!
啊對了,半瓶水超響亮,如有冒犯請告知在下,我會改進。

arrow
arrow
    全站熱搜

    讓地獄深紅的天亮 發表在 痞客邦 留言(0) 人氣()