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