前言
我這個blog是邊操作邊記錄的,到了最后一步,眼看要成功了,卻發現最后Link的時候還有問題解決不了,這時候其實已經快寫完了。然后我發現同樣的操作,搭建Cocos2dx 3.6是完成可以成功的。我不想把blog寫成一遍完整的教學文章,而只想真實地記錄所有的挫折以及所有的成功經驗,所以原來寫的就不改了,將錯就錯地看吧。
如果你想看3.6的搭建經驗,可以一直看下去,只要把文章中所有3.4的地方換成3.6就行了。
一些廢話
最近公司業務需求,要將一個以前用cocos2dx 3.2開發的游戲,換皮、換語言包,然后準備發布到外國去,荼毒外國人民。
我Windows機器上的Cocos環境早就升級到了Cocos2dx 3.12以及Cocos Creator1.3.3,實在不想破壞原來的環境,又懶得再弄一臺Windows機器重新部署,于是把主意打到了現在用的這臺Ubuntu 16.04的電腦上。
是的,就是那么牛叉:有兩臺電腦,用一臺玩一臺。但是沒有Mac電腦,略汗。
很早前就想過在Linux上做游戲開發了,現在來了一了這個心愿吧。
但是3.2畢竟太老了,手上還有幾個項目是用3.4開發的,都用到了已被觸控科技放棄的CocosStudio技術,需要解決同樣的一些問題,去填同樣的坑。為了避免以后公司突發奇想又要弄那幾個3.4的項目,我這次還是直接搭建3.4的環境為好。
準備工作
如果做Android開發,首先應該安裝JavaSdk, Ndk, Ant等工具。如果做ios開發,抱歉你不需要看這篇文章,ios開發必須用ios系統。
早期3.2時代都是在Eclipse下開發的,用官方提供的ADT(Android Devlopment Tools),然后JDK,NDK等都需要自己下載配置。但是現在這個時代,大家都用Android Studio了,雖然偶沒用過,但也必須學啊。Android Studio配置好以后,會自動下載安裝這些需要的東東,目錄結構跟自己弄的會有點不同。大概都在~/Android/Sdk目錄下。另外,Ant我是提前安裝好的,非常簡單: sudo apt install ant 就搞定了。具體Ubuntu下如何安裝配置Android Studio,可百度或者等我有空再來碼一篇。
后記:經過編譯Android實測,Android Studio自動加載的Ndk版本太高,并不兼容,只能自己手動安裝Ndk4.8。后面提到的NDK ROOT必須設置成自己安裝的路徑
然后下載cocos2dx-3.4,我原來就下載好的,貌似現在官網上已找不到。在當前用戶目錄下建立一個Devlop的目錄,將下載好的cocos2dx-3.4文件解壓放進這個目錄。
安裝前還要做一些準備工作,因為cocos比較坑,linux下的sh文件沒有開執行權限,如下所示將三個shell命令文件的權限設置好。
cd ~/Devlop/cocos2d-x-3.4/tools/cocos2d-console/bin
chmod +x cocos
cd ~/Devlop/cocos2d-x-3.4/tools/travis-scripts
chmode +x install_glfw.sh
cd ~/Devlop/cocos2d-x-3.4/build
chmod +x install-deps-linux.sh
開始安裝
1.安裝依賴環境:
cd ~/Devlop/cocos2d-x-3.4/build
./install-deps-linux.sh
開始時會提示:
More info: https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
Press [ENTER] to continue or ctrl-c to cancel adding it
按回車繼續直到安裝完成。
2.配置cocos運行環境:
cd ~/Devlop/cocos2d-x-3.4
python setup.py
中間會提示:
->Please enter the path of NDK_ROOT (or press Enter to skip):
可在此輸入你配置好的NDK路徑或者先回車跳過,回頭配置好后在.bashrc中添加。
完了之后打開~/.bashrc看看:
vim ~/.bashrc
翻到最后,大概這個樣子:
上面三行應該是Android Studio建立的,后面是cocos的setup.py建立的。
我們發現最后兩行跟前三行完全一個意思,果斷注釋了。
最后
source ~/.bashrc
讓這個配置立馬生效。
測試工程
cd ~/Devlop
cocos new myTest -p com.myCompany.myTest -l cpp
大概顯示回應如下:
Running command: new
Copy template into /home/ace/Devlop/myTest
Copying cocos2d-x files...
Rename project name from 'HelloCpp' to 'myTest'
Replace the project name from 'HelloCpp' to 'myTest'
Replace the project package name from 'org.cocos2dx.hellocpp' to 'com.myCompany.myTest'
Replace the mac bundle id from 'org.cocos2dx.hellocpp' to 'com.myCompany.myTest'
Replace the ios bundle id from 'org.cocos2dx.hellocpp' to 'com.myCompany.myTest'
這樣,在~/Devlop目錄下就新生成了一個MyTest目錄,這就是我們的測試工程了。cocos這個生產環境做得很好啊,不但可以new一個新的工程,也可以直接在終端里面編譯運行,如果不調試修改,完全不需要什么IDE。或者,vim做編輯器也是可以的啊。廢話少說,開始編譯:
cd ~/Develop/myTest
cocos compile -p linux
然后我們發現報錯了:
/home/ace/Devlop/myTest/cocos2d/cocos/2d/CCActionCamera.cpp:193:22: error: ‘isnan’ was not declared in this scope
if( isnan(_radius) )
^
坑爹的cocos for linux。調出我們強大的編輯器vim,冒號193:
vim /home/ace/Devlop/myTest/cocos2d/cocos/2d/CCActionCamera.cpp
將這里三個isnan修改為:std::isnan
再次編譯,忽略各種警告(坑爹的cocos!),并不漫長的編譯過程后,又出現同樣的錯誤:
/home/ace/Devlop/myTest/cocos2d/extensions/GUI/CCControlExtension/CCControlUtils.cpp:95:26: error: ‘isnan’ was not declared in this scope
if (isnan(value.h)) // value.h == NAN
好吧我知道會錯的,編譯過程無非就是Debug。再次vim并冒號95
vim /home/ace/Devlop/myTest/cocos2d/extensions/GUI/CCControlExtension/CCControlUtils.cpp
這里就一個isnan,改成std::isnan就行了。
再次編譯,納尼?還有錯?
/usr/bin/ld: lib/libcocos2d.a(CCDevice-linux.cpp.o): undefined reference to symbol 'XOpenDisplay'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
百度看了好多技術文章,暫時找不到頭緒如何解決這個問題。
準備重新裝3.6,因為在此之前我測試過3.6,解決了前面兩個isnan的問題后,就大功告成了。沒有太多時間去填坑了,計劃將原來項目升級到3.6,只要3.6能夠支持原來cocos studio1.6做的ui和armature資源就沒有問題。
最后放一個cocos2dx-3.6編譯成功后的運行圖:
后續處理
別忘記將cocos2d-x-3.4 (或3.6)目錄下對應的兩個文件中isnan修改為std::isnan,這樣以后新生成的工程文件就不會再錯了。
2017-2-16補記:
如果直接修改了cocos2d-x-3.6工程目錄下的isnan,新生成的win32項目就會報錯,說isnan不是std的成員。稍微研究了一下,最好的修改方法是在cpp文件最前面,最后一句#include之后,加上:
#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX
#ifdef isnan
#undef isnan
#endif
#define isnan std::isnan
#endif
就是把這個文件中,linux環境下用到的isnan定義為std::isnan,同時不影響其他文件和其他運行環境。