quick cocos2dx 3.x 配置win32工程
公司項目主體部分用c++,而ui部分用lua寫,所以選擇了用quick框架。項目先開發了ios/mac版,這兩天試著配置其win32工程,遇到一些問題,記錄一下(純c++版本cocos2dx配置方法應該也是類似的)。
先配debug模式:
把c++文件都添到工程中去,并在附加包含目錄下配置c++文件的搜索路徑。然后編譯會遇到一些問題:
一,win32下fullPathForFilename函數與ios/mac下行為不一致的問題。
fullPathForFilename當傳入的參數是文件夾路徑時,ios/mac下與win32下行為不同。
在ios/mac下fullPathForFilename如果傳入的參數是文件夾路徑且路徑存在,就能返回正確的全路徑。但在win32下,如果傳入的參數是文件夾路徑,則將原樣返回傳入的參數。
由于項目中使用了fullPathForFilename來獲得文件夾全路徑,所以在ios/mac下正常,而在win32下得不到正確結果。解法見:http://www.cnblogs.com/wantnon/p/4295876.html
二,找不到pdb調試信息error。
將 屬性->?C/C++ -> 常規 ->調試信息格式 設置為 C7 兼容(/Z7)。
三,拷貝資源腳本。
此時程序能正常啟動了,但運行過程中會因找不到資源而崩潰,原因是一部分資源沒有出現在 工作目錄$(OutDir)../../../../runtime/win32 之下,事實上 工作目錄 本來是空的,是在程序編譯過程中的某一階段,資源被從其所在的文件夾下被拷貝到 工作目錄 下。可以在 屬性->生成事件->預先生成事件->命令行 中看到如下腳本:
if not exist "$(LocalDebuggerWorkingDirectory)" mkdir "$(LocalDebuggerWorkingDirectory)"
mkdir "$(LocalDebuggerWorkingDirectory)\src"
mkdir "$(LocalDebuggerWorkingDirectory)\res"
xcopy "$(ProjectDir)..\..\..\src" "$(LocalDebuggerWorkingDirectory)\src" /e /Y
xcopy "$(ProjectDir)..\..\..\res" "$(LocalDebuggerWorkingDirectory)\res" /e /Y
copy "$(ProjectDir)..\..\..\config.json" "$(LocalDebuggerWorkingDirectory)\config.json" /Y
可以進入到編輯對話框,然后點“宏(M)>>”打開宏列表來查看$(LocalDebuggerWorkingDirectory)和$(ProjectDir)的定義。
xcopy和copy的區別:xcopy可以復制目錄和文件,copy只復制文件。
在quick cocos2dx中lua文件默認放在"$(ProjectDir)..\..\..\src"下,資源文件默認放在"$(ProjectDir)..\..\..\res”下。
在我們的項目中,有一部分資源沒有按此規范放到"$(ProjectDir)..\..\..\res”下,而是放到了自己的目錄myRes下,因此需要自己添加腳本實現將這部分資源拷貝到 工作目錄,添加下面兩句即可:
mkdir "$(LocalDebuggerWorkingDirectory)\myRes"
xcopy "$(ProjectDir)..\..\..\c3dToolKit\toolKitRes" "$(LocalDebuggerWorkingDirectory)\myRes" /e /Y
?
此時debug下可以正確運行了。
再配置release模式:
同樣按上面方法配置release模式后發現無法正常運行。
四,.c文件報錯。
一些純c寫成的第三方庫,例如sqlite3.c等文件會報一些語法錯誤,例如?void*不能隱式轉化為char*, 在結構體A內部定義的結構體B在外部使用時如果不寫成struct A::B而僅寫成struct B則找不到定義 等。產生這些錯誤的原因顯然是編譯器按照c++的標準去編譯c了,當然將這些.c文件中的c語法改寫為c++是可以解決問題的,但由于如sqlite3.c這樣的大文件需要修改的地方實在太多,所以改成c++語法的方法不現實。后來發現在 屬性->c/c++ ->高級->編譯為 中可以選擇“編譯為c++代碼(/TP)”或"編譯為c代碼(/TC)",而且這個屬性是可以每個文件單獨設置的,細看debug模式的設置,發現是整個工程的“編譯為”屬性設置為"編譯為c++代碼",而如sqlite3.c等純c文件的“編譯為”屬性設置為“默認值”,另外整個工程的“強制包含文件”屬性設置為“algorithm”,而如sqlite3.c等純c文件的"強制包含文件"屬性置空。(如果純c文件的"強制包含文件"屬性不置空,而設置為"algorithm"的話,會報?error C2054: 在“using”之后應輸入“(” 的錯誤。)于是release模式下也照此設置,則問題解決。
五,error LNK2005: xxx已經在 lua51.lib(lua51.dll) 中定義。
對比debug和release的 屬性->連接器->輸入->附加依賴項,其中release下多了一個lua51.lib,而debug下沒有這一項,將release下的lua51.lib去掉,就不再報此error。
六,“工作目錄”和“命令”。
屬性->調試->命令,屬性->調試->工作目錄,這兩項release與debug配置不一樣,由于debug配置已確信是可行的,索性將release配置改成與debug相同:
命令:$(OutDir)../../../../runtime/win32/$(TargetFileName)
工作目錄:$(OutDir)../../../../runtime/win32
其中“命令”是可執行程序的路徑,“工作目錄”是資源目錄。
通過查看宏值可以發現 $(LocalDebuggerWorkingDirectory) 與?工作目錄 是保持一致的。
七,丟失dll的問題。
編譯通過,但啟動時彈出“無法啟動此程序,因為計算機中丟失xxx.dll”報錯。
是因為dll沒拷貝到 工作目錄 下。查看debug模式下的?屬性->生成事件->后期生成事件,發現有下面腳本:
xcopy /Y /Q "$(OutDir)*.dll" "$(ProjectDir)..\..\..\runtime\win32\"
而release模式下卻沒有此段腳本,于是把同樣的腳本添加到release模式下,問題即可解決。
八,項目及依賴項目release模式下編譯優化設置。
通常debug模式下將編譯優化全關掉即可。而對于release模式,由于目的是生成運行速度快的可執行程序,所以應將編譯優化選項選為“使速度最大化”,另外不要忘記檢查各依賴項目(libbox2d,libcocos2d,libluacocos2d,libSpine)的release模式是否也設置了“使速度最大化”,因為我發現我這個項目的release模式下各依賴項目的編譯優化在默認情況下并沒有設成"使速度最大化"。
?
轉載于:https://www.cnblogs.com/wantnon/p/4298770.html
總結
以上是生活随笔為你收集整理的quick cocos2dx 3.x 配置win32工程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10.app后端选择什么开发语言
- 下一篇: 状态栏消息提示——使用Notificat