前言
我这个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,同时不影响其他文件和其他运行环境。