cocos2d-x启用luajit的5.2特性
文章目录
cocos2d-x中使用的luajit的库是预编译
也就是prebuilt
的,
但是这个预编版本并没有启用5.2的特性,也就是说
pairs() and ipairs() check for __pairs and __ipairs
这个特性是不被支持的.
我需要在项目中使用 cloudwu/pbc
这个protobuf的lua解析库,这在个库中,用到了5.2的这个特性
查看pbc
的源码 __pairs使用源码
|
|
从源码中我们可以看出,pbc对于protobuf的解析并不是全部解析的,
也就是说,遇到message嵌套的情况,初始只
解析一层消息,
当代码调用下一层消息的__index
和__pairs
元函数的时候,
才会进行下一层消息的实际解析
那么问题来了,当这个库用在cocos2d-x
上的时候,我们在
|
|
的时候,是不会调用到expand方法的,这样获取的消息内容当然也就不正确了
为了能顺利的使用pbc
库,我们需要启用luajit的这个特性
根据luajit官网说明lujit/extensions,
可以通过编译时加入预定义LUAJIT_ENABLE_LUA52COMPAT
宏来启用这一特性.
以cocos2d-x 3.0rc0
版本为例,luajit的源码路径为cocos2d-x-3.0rc0/external/lua/luajit
,
使用的luajit版本为2.0.1-hotfix
,源码中已经打好了hotfix的包.
并且在根目录下提供了
build_android.sh
build_ios.sh
build_mac.sh
三个编译脚本用来生成不同平台的预编译库
但是,恩,但是
,源码里不知道为何把Makefile
文件删除了.
我们需要去官网下载2.0.1
版本的luajit
源码,然后把两个Markfile
文件,
拷贝到cdx对应的目录下. 注意,有两个Markfile
,luajit
源码的根目录下一个,
src
目录下一个.
##首先在windows平台下进行编译
windows平台的编译脚本是cocos2d-x-3.0rc0/external/lua/luajit/src/src/msvcbuild.bat
- 修改
msvcbuild.bat
文件,找到@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
, 添加编译参数,更改为@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /DLUAJIT_ENABLE_LUA52COMPAT
- 不能在命令行直接调用这个bat脚本,因为需要vs编译环境参数,打开vs的命令行工具.
- 切换到编译脚本所在路径,运行
msvcbuild.bat
完成编译
编译成功后会生成
luajit.exe
用于编译lua脚本的工具lua51.dll
库文件lua51.lib
库文件
##windows版本的编译没有使用Makefile文件,但是其他版本的编译都使用了Makefile文件,所以我们直接把编译参数在Makefile里更改就可以了
在cocos2d-x-3.0rc0/external/lua/luajit/src/src
中找到刚改从luajit
源码中拷贝过来的Makefile
.
找到#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
,把注释取消,XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
.
##ios版本的编译
打开build_ios.sh
文件,根据自己xcode的版本修改成自己的参数
|
|
然后执行就好了
##mac版本的编译和ios差不多,而且不用更改编译脚本
##android版本的编译
首先要在系统上安装ndk,并且设置NDK_ROOT
环境参数,因为编译脚本要用到
打开build_android.sh
文件,修改相应的参数
|
|
这个参数需要更改为windows
|
|
|
|
编译后就能获得android版本的库了
所有库编译完成后,我们就可以在各个平台的luajit中支持5.2的这些特性了
文章作者 hao
上次更新 2014-10-29