cocos2d-x引擎库binary版本制做(Windows环境)

你们可能以为很奇怪,cocos2d-x引擎库的编译不是很简单嘛?不就是下载源码包,解压并打开vs工程,分别对debug跟release两个版本按一下编译就行了吗?对的,编译就这样就完成了。不过,我发现这样编译出来的库好像“移植性”不是很好,不能直接拷贝到另一台电脑直接使用。因而,我尝试将这个编译好的引擎库变得更加的有“移植性”,并分享这个过程。 python

(这里的“移植性”之因此用分号,是由于这不是说这个库不能移植到不一样平台,而是说不能知道拷贝到其余电脑,而后直接使用。) android

------------------------------------------------------------- windows

首先,说明一下我为何要干这个引擎库拷贝的事情。是这样的:我原本有个台式机,已经配置好cocos2d-x环境了,而后最近买了手提。因而我想在手提上也装个cocos2d-x环境。而后我想,既然cocos2d-x是一个C++编写的函数库(引擎框架),理论上应该是能够直接拷贝到另一台电脑使用的。因而我把台式的编译好的cocos2d-x库拷贝到了手提,结果编译一个HelloWorld都要整个cocos2d-x从新编译一次。因此,一台电脑编译,拷贝到另外一台电脑使用的想法彷佛有问题。 框架

------------------------------------------------------------- 函数

其实,在一台电脑编译,拷贝到另外一台电脑使用的想法是没问题的。不少C++的函数库的编译好的版本(binary)不就是这个意思吗?cocos2d-x的之因此出问题,是cocos2d-x自己提供能的工程模板的依赖项的参数设置有一些问题。 ui

咱们经过cocos2d-x包中的tools目录下的create_project的python脚原本建立cocos2d-x项目,打开新建的项目,咱们发现里面不但有咱们想要的那个工程,还有libBox2d, libExtensions等好几个工程,它们对应为咱们所要用到的cocos2d-x框架的库。它们跟咱们想要的工程放到同一项目,咱们的项目依赖于它们。在连接的时候,咱们的工程会到它们那里查找想要的库。这样,咱们的工程就可使用这些库了。右击这些库工程,查看属性,点开“Build Events”,它们大部分都有定义“Pre Link Events”的操做。基本都是<if not exist "$(OutDir)" mkdir "$(OutDir)" xcopy /Y /Q "×××××" "$(OutDir)">。这就使得在第一次连接的时候,因为尚未输出的文件夹,因此它会新建输出文件夹并将这几个依赖库的lib跟dll等都复制到项目的输出文件夹中。这样,咱们的工程就可以使用这些lib库来连接编译了。 spa

一切看上去都很好的发生着。不过,其实这种在同一个项目中多个工程,而且咱们的工程以来其余库工程的作法,正是cocos2d-x编译包不能拷贝到其余电脑直接使用的缘由。由于,在咱们把整个编译包拷贝到别的地方的时候,那些库工程的路径实际上是发生了变化,vs在检测路径变化后,它会认为工程变化了,代码须要从新编译,因此,咱们的cocos2d-x源码就要从新编译了。为了解决这种路径变化,库工程从新编译的问题,咱们须要作的就是移除以来的库工程,直接指定咱们想要用的库的位置就好了。由于咱们的库其实早已经编译好了。 操作系统

咱们来看看怎样消除咱们项目对库工程的依赖。咱们的项目是经过create_project.py脚原本建立的。打开这份代码看一下,(虽然我不会python,可是大概知道它想要干什么。)它的做用就是复制cocos2d-x包下template目录下的其中一种模板(如cpp)到project目录下,并将工程的名字修改成咱们想要的名字。因此,理论上咱们只要去除template中项目(我修改的也只是cpp模板的)项目对库工程的依赖性,后续建立的项目也就不会以来库工程了。 debug

打开template\multi-platform-cpp\proj.win32下的HelloWorld.sln,右击solution,查看其属性,在configuration properties中,咱们看到咱们的项目依赖其余几个库项目。关闭属性,在Solution Explorer中,逐一右击咱们的库项目,点击remove来将它们移除出工程。这是,咱们项目对库项目的以来也自动消失了。可是,咱们的项目会由于找不到咱们想要的函数库(cocos2d-x库以及box2d库等)而不能编译。因此咱们还要为项目指定函数库的位置。假如配置过C++函数库的朋友,可能对接下来的步骤很是熟悉。右击HelloWorld项目,打开属性,点开Linker->input。咱们看到已经有了要用的函数库(lib),只是项目不知道这些库放在哪里。再点开VC++ Directories,看Library Directories项,为它添加一个值,为..\..\..\Debug.win32或..\..\..\Release.win32(根据你设置的是Debug仍是Release模式下的属性而定)。它使用相对路径,指定咱们编译好的cocos2d-x库的所在目录。这样,咱们的项目就能够找到相应的lib并编译和连接,而且不会由于cocos2d-x包的位置变化而从新编译库了。可是,咱们的工做还没完成。由于在运行的时候,会由于找不到相应的dll而没法运行。配置过C++函数库的朋友可能会想,把cocos2d-x编译出来的dll都放到system32下吧。这是一种方法,但有点违背我刚开始想要的“移植性”。由于拷贝到另一台电脑,又要从新将dll复制到system32了,而且cocos2d-x库编译出来的dll数量仍是比较多的。这里,我使用的方法不知把dll复制到system32,而是在编译的时候,让vs自动把dll复制到咱们的项目输出目录。由于dll也不算大(debug跟release版的基本都是10 orm

m左右),而且不用手动配置,且咱们不想要cocos2d-x库的时候,整个文件夹删除就能够了,不用污染到system32文件夹。实现方法是在项目的Build Events下的Pre Link Events添加操做脚本<if not exist "$(OutDir)" mkdir "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\..\Debug.win32\*.dll" "$(OutDir)"
>.

至此,咱们对模板项目的修改完成。注意,咱们是在修改模板,因此不要按下编译键。而且关闭vs后,将模板文件夹下原本没有的一些vs自动生成的文件删除。这样,咱们的“可移植”的cocos2d-x库就制做完成了。

-------------------------------------------------------------

虽然,我用“可移植”这个词。但其实仍是有不少限制的,例如想要使用编译好的cocos2d-x库的人的电脑要使用跟首次编译cocos2d-x库的人的电脑的vs版本相同,至于操做系统版本彷佛也有关联。例如,我在台式机win8 64位上经过vs2012编译并制做的可移植模板,拷贝到个人手提win8 64位上,使用vs2012是能够直接使用cocos2d-x库而不用从新编译的。但我拷贝到一台win7 32位使用vs2010的电脑是是不能使用的。

因此,使用win8 64位vs2012的朋友,有兴趣能够下载下面连接分享的可移植包,看看是否真的可以直接使用:

http://pan.baidu.com/s/1GMe30

为了使压缩包小一点,我把编译好的sample整个给删掉了(我对编写sample的大神表示万分的尊重)。还有也删掉了其余一些除Windows跟android项目的编译好的库。

还有,这个包理论上只要下载后,运行project目录下的new.bat,便可生成工程,而后打开工程便可成功编译。(这里的new.bat实际上仍是调用create_project.py的,因此仍是要安装python环境的。)


而使用其余配置的windows的朋友,能够尝试下面连接,是修改后的模板工程。

http://pan.baidu.com/s/1CItkV

理论上,只要你编译好cocos2d-x源码包,并将这个模板工程替换源码包的模板。而后你就能够将你编译好的包分享给别人了,其余使用系统配置跟你同样的朋友就不用再编译了。

-------------------------------------------------------------

最后,我说说我对cocos2d-x中模板原来使用工程依赖作法的见解(也只是个人我的见解,我猜猜而已)。这其实不是一个错误或者是一个失误,而是另一种思路。它为引擎库使用者提供了更大的自由度,而且鼓励咱们修改源码。由于,假如咱们有什么特别需求,须要修改引擎源码。那么,依赖的库工程会检测到源码被修改了,库便会被从新编译,以达到咱们想要的效果。能够说,这实际上是一种更高明的作法,一种针对更高要求的框架使用者的处理方法。不过,对于我这种渣渣普通使用者,不少时候我是想要开封后便可使用的编译好的库,无需繁杂的配置跟漫长的编译。因此,我仍是但愿有人可以作这种预编译好的库,可以让我这种懒人使用者来用的。

相关文章
相关标签/搜索