将cocos2d-x项目从x-code移植到vs2012下记录
刚刚以新人身份进入一家手游公司,被分配到《黑暗之光》项目小组。今后在参与项目功能扩展的同时会负责android部分的第三方库接入等工作。
由于我个人之前都是在windows下工作,公司考虑到熟悉mac环境时间以及mac机高昂的价格再以及今后再有没有mac系统经验的新员工入职的情况,让我在windows下将项目环境搭建起来。
环境
OS:windows7 64bit
cocos2d-x版本:2.1.4
IDE:VS2012
搭建环境主要经过的步骤:创建空项目->添加黑暗之光项目源码->添加各种头文件->添加第三方库->解决语法问题->解决各种无法解析的外部符号问题。
编译项目中出现的问题主要有以下几点:
解决的问题:
1、平台相关内容修改,如mac内置类型ssize_t改成windows下的unsigned long、atoll改成atol等。
2、由于中文字符编码方式不同造成的 语法错误。解决方式:中文后面加英文字符|标点,因为代码中的中文一般是日志,如果是游戏相关的今后也会放到xml文件中。
3、回调函数类型与cocos2d-x定义的回调函数类型不一致导致的错误(有些回调函数在运行的时候以函数指针的方式动态加载,编译的时候检测不到运行时会崩溃)。
example:
cocos2d-x中menu的回调函数参数类型是:CCObject*,而黑暗之光项目中定义的回调函数参数用的是自定义的继承至CCObject的MenuItem。x-code可以通过函数指针的强制类型转换,vs却不行,必须要严格的保持函数类型一致。最后修改了一大堆的函数声明。
4、添加windows下的socket静态链接库“Ws2_32.lib”。
5、项目中使用到android相关接口,但是在工程目录下找不到相关头文件。在jdk中找到jni.h、jawt_md.h、jni_md.h,在ndk目录下找log.h引入项目中解决问题
6、项目中一些声明了的函数但是没有实现部分导致的无法解析的外部符号问题,补上实现部分。
问题原因总结:
1)不同IDE使用的编译器标准不同
2)开发人员粗心或者被友好的编译器误导,没有严格遵守C++标准
3)cocos2d-x框架源码上的小错误
4)泛滥的第三方库
后记:
由于vs的编译速度完完全全比不上x-code(将近6倍的编译速度差距),这点事在公司整了3天还没搞定,现在中秋放假在家里一边看电视一边找问题终于搞定了。