使用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编译环境,而这类配置我已经写过一篇文章搞定了:

Cocos2d-x Windows 7配置备忘

我觉得唯一有点价值的是这一篇: 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的情况下,我先拿这个小项目练手。

  1. 新建 d:\temp\cygwincpp 文件夹,作为一个新的 workspace 。新建一个workspace是为了避免与原来配置的冲突,保证是一个全新的配置;
  2. Eclipse File->Switch Workspace ,切换到这个 workspace;
  3. Windows->Preference->C/C++->Debug-Source Lookup Path ,增加一个 Path Mapping
  4. Compliation Path 填写 \cygdrive\cLocal file system path 填写 c:\
  5. 如果有更多的盘符,最好全部添加到 Path Mapping 中;
  6. 路径映射的作用是在使用gdb调试的时候,让gdb能够找到基于cygwin路径的文件;
  7. New->C++ Project->Static Library->Empty Project->Cygwin GCC ,创建一个空的库项目,命名为 chipmunk
  8. 打开 chipmunk 项目的属性,C/C++ Build->Enviroment 界面应该已经自动设置了 PATH 变量。这个变量仅用于这个项目,不会影响环境变量的值。这个变量中已经默认加入了 ${CYGWIN_HOME}\bin 路径;
  9. 如果你的环境变量中没有 CYGWIN_HOME ,那么设置它,指向cygwin的安装目录即可;
  10. 或者你也可以直接在 C/C++ Build->Enviroment 界面中, 在 PATH 之前增加一个 CYGWIN_HOME 变量,指向cygwin的安装目录;
  11. 项目属性 C/C++ Build->Settings->Tool Settings->Cygwin C Compiler->Miscellaneous->Other flags ,在编译参数的最后加入 -std=c99 参数。否则在编译的时候会for循环格式错误;
  12. 项目属性 C/C++ Build->Settings->Binary Pasers 确保 Cygwin PE Parser 处于选中状态。这个设置保证在编译出错的时候,可以通过点击错误文本直接跳转到错误源码位置;
  13. [cocos2d-x]\external\chipmunk\ 下的 srcinclude 目录复制到新建的项目所在目录中;
  14. 项目属性 C/C++ General->Paths and Symbols->Includes->GNU C ,添加 include/chipmunk 路径;
  15. Eclipse Project->Build ,默认会构建 Debug的程序;
  16. 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

  1. 复制 [cocos2d-x]\external\chipmunk\proj.linux[cocos2d-x]\external\chipmunk\proj.elipse.mingw
  2. 使用Eclipse导入这个项目,由于在Linux下也是使用CDT来建立的项目,因此项目的名称等都已经配置好;
  3. 打开 libChipmunk 项目的属性,C/C++ Build->Enviroment界面应该已经自动设置了 PATH 变量,且已经默认加入了 ${MINGW_HOME}\bin;${MSYS_HOME}\bin 路径;
  4. 在操作系统环境变量中/或者在 C/C++ Build->Enviroment 界面的 PATH 之前定义 MINGW_HOMEMSYS_HOME 这两个变量,分别指向 MinGW 和 MSYS的安装目录;
  5. 在我的机器上,它们是 d:\MinGWd:\MinGW\msys\1.0
  6. 项目属性 C/C++ Build->Settings->Tool Settings 将Debug和Release的 Current Toolchain 改为 MinGW GCC
  7. 其他的配置,与 cygwin 的类似。

使用 MinGW 编译 libChilpmunk 也比较顺利。 我接着又使用同样的方法编译了 cocos2d-x 自带的Box2D库,也成功了。

六、在 MinGW 环境下编译 libCocosDenshion

我采用和编译 libChipmunk/Box2D 同样的方法,来编译 libCocosDenshion。

这个编译碰到了许多问题,最终以失败告终。虽然失败了,我还是把自己的几点体会和注意事项总结一下:

  1. 与前面两个库不同,libCocosDenshion 包含了太多平台相关的库;
  2. 有的include库包含了 MINGW32 宏,说明对MINGW32做了优化,而有的库则没有;
  3. Linux项目对于平台相关库,引用的是Linux相关的头文件,我需要把它们都切换成w32的头文件;
  4. 可能正如 Now compiles with the mingw compiler 所说,必须自己写 cmake 文件才能正常编译(该文透漏自己改了许多地方),而我没有cmake经验,也暂时没有大量时间去研究它;
  5. 对 gcc 编译器的使用方法不熟悉,对命令行参数不熟悉。

七、总结

如果连 libCocosDeshion 都编译不过,自然就不能尝试 libCocos2d 了。这次配置最终还是失败了。

我后来又不甘心尝试了使用 MS Virtual C++ 编译环境,依然是碰到了许多问题,但我已无力(更无心)去解决了,或许这才是正道吧。

还是打回原形老老实实去调教VS吧。

八、参考文章