使用Eclipse+CDT开发Cocos2d-x(不用Visual Studio)
首先声明,这个尝试没有成功。我依然还是必须使用Visual Studio。
Cocos2d-x 中的项目,在Windows下默认使用Visual Studio作为开发工具。
但我并不喜欢Visual Studio,经过了一个月的折磨,用Visual Studio Express 2012做了两个小项目之后,我实在是无法习惯它,心里一直希望能用Eclipse+CDT来代替它。
花时间google了一下,发现此类文章几乎没有。中文社区应该是都认为VS很好用,极少有我这样的变态非要用Eclipse。搜到的文章大多数都是讲解如何基于Eclipse+CDT+cygwin/NDK来配置Android编译环境,而这类配置我已经写过一篇文章搞定了:
我觉得唯一有点价值的是这一篇: Now compiles with the mingw compiler ,作者修改的代码应该已经合并进入cocos2d-x分支,但他并没有提供他所说的cmake代码,这导致我必须再去研究cmake。时间所限,我没有在这篇文章上纠结太久。
我是个惯于折腾的人,曾经放着Flash Builder不用,去折腾 Vim调用Ant编译swf并自动调试 ,也花了一些时间 修改cocos2d-x项目创建器,支持自定义项目路径 。虽然知道这次折腾肯定会浪费不少时间,但我还是义无反顾地开始了。
注意:
- 下面的折腾,假设Eclipse+CDT、cygwin、MinGW/MSYS均已经安装好。
- 为了统一界面版本和偷懒,所有的步骤不会有截图,全部采用文字描述。
- 如果希望看step to step,推荐这篇:How to setup Eclipse CDT environment on Windows
一、 选择编译器
既然不愿意用VS,那么当然也不愿意选择VS的编译器。
我平时工作的时候,是完全离不开cygwin的,使用git、用bash写脚本,全部都在cygwin下进行。因此我自然而然选择了cygwin作为编译环境。
选择cygwin环境的另一个好处是可以实现交叉编译——在Windows系统上编译Linux程序。编译出来的程序依赖cygwin1.dll,而不依赖ms的运行库。
同时,也可以利用cygwin调用mingw环境来编译不依赖cygwin1.dll的windows应用程序。
关于cygwin和MinGW,这里有篇文章做知识普及: Cygwin与MinGW/MSYS,如何选择?
二、cygwin环境配置
网上的教程大多数都是要求把cygwin/bin目录加入到系统的PATH变量。我认为这是没有必要的。
加入PATH变量的确方便,但也为后面切换编译器带来了麻烦。
假设我们需要在一台电脑上同时使用cygwin和MinGW环境,那么PATH中的路径就会发生冲突。
正确的方法,应该是直接在C++项目中设置项目的PATH变量。这样不会对系统PATH造成任何影响,也方便切换编译环境(例如从cygwin切换到MinGW)。
三、在cygwin环境下编译chipmunk
chipmunk是cocos2d-x中包含的一个物理引擎,位于 [cocos2d-x]\external\chipmunk\
,在不熟悉的Eclipse+CDT的情况下,我先拿这个小项目练手。
- 新建
d:\temp\cygwincpp
文件夹,作为一个新的 workspace 。新建一个workspace是为了避免与原来配置的冲突,保证是一个全新的配置; - Eclipse
File->Switch Workspace
,切换到这个 workspace; Windows->Preference->C/C++->Debug-Source Lookup Path
,增加一个Path Mapping
;Compliation Path
填写\cygdrive\c
,Local file system path
填写c:\
;- 如果有更多的盘符,最好全部添加到 Path Mapping 中;
- 路径映射的作用是在使用gdb调试的时候,让gdb能够找到基于cygwin路径的文件;
New->C++ Project->Static Library->Empty Project->Cygwin GCC
,创建一个空的库项目,命名为chipmunk
;- 打开
chipmunk
项目的属性,C/C++ Build->Enviroment
界面应该已经自动设置了PATH
变量。这个变量仅用于这个项目,不会影响环境变量的值。这个变量中已经默认加入了${CYGWIN_HOME}\bin
路径; - 如果你的环境变量中没有
CYGWIN_HOME
,那么设置它,指向cygwin的安装目录即可; - 或者你也可以直接在
C/C++ Build->Enviroment
界面中, 在PATH
之前增加一个CYGWIN_HOME
变量,指向cygwin的安装目录; - 项目属性
C/C++ Build->Settings->Tool Settings->Cygwin C Compiler->Miscellaneous->Other flags
,在编译参数的最后加入-std=c99
参数。否则在编译的时候会for循环格式错误; - 项目属性
C/C++ Build->Settings->Binary Pasers
确保Cygwin PE Parser
处于选中状态。这个设置保证在编译出错的时候,可以通过点击错误文本直接跳转到错误源码位置; - 将
[cocos2d-x]\external\chipmunk\
下的src
和include
目录复制到新建的项目所在目录中; - 项目属性
C/C++ General->Paths and Symbols->Includes->GNU C
,添加include/chipmunk
路径; - Eclipse
Project->Build
,默认会构建 Debug的程序; - Build成功之后,可以使用F11进行gdb调试。
编译chipmunk是比较顺利的。但chipmunk完全使用C++写成,没有依赖特定平台的代码。CocosDenshion 就不同了,它利用了不同平台的代码进行处理,我使用cygwin无法将其编译成功。
使用cygwin还有一个问题,就是不支持Windows路径。make自动生成的源码,中间如果包含 C:\...
开头的绝对路径,就会无法编译。
chipmunk能够正常编译,是由于我们把源码复制到了项目中,它的编译完全是基于相对路径的。而cocos2d-x其他项目的互相引用非常复杂,不太容易完全使用相对路径进行配置。而且我又碰到了一个更纠结的问题:在使用相对路径引用的时候,如果路径不在项目中,即使填写是正确的,CDT总是报错找不到源文件。
在纠结的编译过程中,我还发现有些头文件干脆就只能允许 Visual C++ 编译器来编译(源码中的提示),这说明用cygwin环境来编译win32上的cocos2d-x根本行不通。
但是,我在源码中也看到了许多 MINGW32 宏,这说明cocos2d-x是为 MINGW32 做过优化处理的,或许和上面提到的 Now compiles with the mingw compiler 有关。而且 MINGW 可以看作是原生执行的Windows程序,因此我决定改为使用 MinGW 编译器来继续折腾。
四、MinGW环境配置
由于上面说到的原因,我换用 MinGW 作为编译环境。设置与 cygwin 类似,不必把 MinGW 路径加入 PATH,只需要定义两个环境变量,或者直接设置C++项目的 Enviroment 即可。
在 cocos2d-x 提供的项目中,Linux项目是使用Eclipse建立的。而且,Linux项目也是采用 gcc 编译器,很多配置都是一样的。所以,我采用比较取巧(也是偷懒)的办法,直接复制Linux项目,基于Linux项目进行修改,然后编译。
五、在 MinGW 环境下编译 libChipmunk
- 复制
[cocos2d-x]\external\chipmunk\proj.linux
为[cocos2d-x]\external\chipmunk\proj.elipse.mingw
; - 使用Eclipse导入这个项目,由于在Linux下也是使用CDT来建立的项目,因此项目的名称等都已经配置好;
- 打开
libChipmunk
项目的属性,C/C++ Build->Enviroment
界面应该已经自动设置了PATH
变量,且已经默认加入了${MINGW_HOME}\bin;${MSYS_HOME}\bin
路径; - 在操作系统环境变量中/或者在
C/C++ Build->Enviroment
界面的PATH
之前定义MINGW_HOME
和MSYS_HOME
这两个变量,分别指向 MinGW 和 MSYS的安装目录; - 在我的机器上,它们是
d:\MinGW
和d:\MinGW\msys\1.0
; - 项目属性
C/C++ Build->Settings->Tool Settings
将Debug和Release的Current Toolchain
改为MinGW GCC
; - 其他的配置,与 cygwin 的类似。
使用 MinGW 编译 libChilpmunk 也比较顺利。 我接着又使用同样的方法编译了 cocos2d-x 自带的Box2D库,也成功了。
六、在 MinGW 环境下编译 libCocosDenshion
我采用和编译 libChipmunk/Box2D
同样的方法,来编译 libCocosDenshion。
这个编译碰到了许多问题,最终以失败告终。虽然失败了,我还是把自己的几点体会和注意事项总结一下:
- 与前面两个库不同,libCocosDenshion 包含了太多平台相关的库;
- 有的include库包含了 MINGW32 宏,说明对MINGW32做了优化,而有的库则没有;
- Linux项目对于平台相关库,引用的是Linux相关的头文件,我需要把它们都切换成w32的头文件;
- 可能正如 Now compiles with the mingw compiler 所说,必须自己写 cmake 文件才能正常编译(该文透漏自己改了许多地方),而我没有cmake经验,也暂时没有大量时间去研究它;
- 对 gcc 编译器的使用方法不熟悉,对命令行参数不熟悉。
七、总结
如果连 libCocosDeshion 都编译不过,自然就不能尝试 libCocos2d 了。这次配置最终还是失败了。
我后来又不甘心尝试了使用 MS Virtual C++ 编译环境,依然是碰到了许多问题,但我已无力(更无心)去解决了,或许这才是正道吧。
还是打回原形老老实实去调教VS吧。
八、参考文章
- Setup Cygwin toolchain in Eclipse CDT
- 不用vs和cygwin!Eclipse+cdt实现cocos2dx跨平台解决方案(Android版)
- Eclipse 4.3 (Kepler) for C/C++ Programming How To Install Eclipse CDT 8.2 and Get Started
- Eclipse CDT + Cygwin C/C++开发配置中的问题
- error: ‘for’ loop initial declarations are only allowed in C99 mode
- 将 Visual Studio C 和 C++ 项目迁移到 Eclipse CDT
- 文章ID:1947
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/using-eclipse-cdt-to-develop-cocos2d-x-no-visual-studio/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。