quick-cocos2d-x 集成 google protobuf 方法
@H_
502_6@
@H_
502_6@ 有人问到我了, 我
分享一下
方法。
@H_
502_6@
@H_
502_6@ 如果感觉太乱请见谅, 几次编写后提交
错误,
内容被清空, 无奈只好本地用markdown规范编写, 贴到了论坛里。
@H_
502_6@ 如果你有密集恐惧症, 请移步
http://ablegao.me/posts/quick-cocos2d-x-protobuf.html , 这个地方看着会舒服一些。
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@ ##第一步 需要最新的protobuf 类库和解析程序。
@H_
502_6@
https://github.com/sean-lin/protoc-gen-lua
@H_
502_6@
@H_
502_6@
@H_
502_6@ git clone
https://github.com/sean-lin/protoc-gen-lua.git 到任意的一个地方
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@ 然后,可以得到重要的两个目录
@H_
502_6@
@H_
502_6@
@H_
502_6@ protoc-gen-lua/plugin/
@H_
502_6@ protoc-gen-lua/protobuf/
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@ ##第二步, 我们需要使用protoc —lua_out=. 这种
方法, 将我们自己的*.proto 的
文件解析成lua
文件
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@
@H_
502_6@ plugin目录是提供将buffer
文件解析成lua 版本的类库, 需要python
支持。 如果已经编译了google 官方的protoc 那个程序, 只需要在系统PATH环境变量总追加plugin目录就好:
@H_
502_6@
@H_
502_6@
@H_
502_6@ export PATH={protoc-gen-lua DIR }/plugin:$PATH
@H_
502_6@
@H_
502_6@
@H_
502_6@ 关于protoc的编译另请google .
@H_
502_6@
@H_
502_6@
@H_
502_6@ 如果解析不出lua
文件来, 可以手动志信一下plugin/protoc-gen-lua的程序, 他应该是+x 的权限(chmod +x plugin/protoc-gen-lua)
@H_
502_6@
@H_
502_6@
@H_
502_6@ 细节的安装步骤可以参考
https://code.google.com/p/protoc-gen-lua/ ##第三步 , 将protobuf 集成到quick 中 protoc-gen-lua/protobuf/ 目录就是要编译到quick-cocos2d-x目录里面的部分。 现在, 我们只需要 protoc-gen-lua/protobuf/pb.c 这个
文件 先确定自己的quick-cocos2d-x lua扩展目录: ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/ 所有lua 的c/c++现成扩展,都可以直接放到这里。 将pb.c这个
文件复制到 lua_extension目录下, 最好独立一个目录, 免得扩展多了乱。 这是我的目录结构: ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c 然后开始
修改扩展程序
配置文件,lua_extensions.c 他的路径: ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c 目前是一个不足60行的小
文件, 我打算全部贴进来: #include "lua_extensions.h" #if __cplusplus extern "C" { #endif // cjson #include "cjson/lua_cjson.h" // zlib #include "zlib/lua_zlib.h" // lpack #include "lpack/lpack.h" // socket #include "socket/luasocket.h" #include "socket/mime.h" #include "socket/socket_scripts.h" // filesystem #include "filesystem/lfs.h" // l
sqlite3 #include "l
sqlite3/l
sqlite3.h" #include "protobuf/pb.c" //引用protobuf 库
文件 static luaL_Reg luax_exts[] = { {"cjson",luaopen_cjson_safe},{"zlib",luaopen_zlib},{"pack",luaopen_pack},{"socket.core",luaopen_socket_core},{"mime.core",luaopen_mime_core},{"lfs",luaopen_lfs},{"l
sqlite3",luaopen_l
sqlite3},{NULL,NULL} }; void luaopen_lua_extensions(lua_State *L) { // load extensions luaL_Reg* lib = luax_exts; lua_getglobal(L,"package"); lua_getfield(L,-1,"preload"); for (; lib->func; lib++) { lua_pushcfunction(L,lib->func); lua_setfield(L,-2,lib->name); } lua_pop(L,2); // load extensions script luaopen_socket_scripts(L); luaopen_pb(L); //这是加入的protobuf 扩展
注册名 } #if __cplusplus } // extern "C" #endif 至此 , protobuf 扩展部分就算扩展完成了。 确认是否成功
支持 , 可以在quick 项目最先被
调用的lua
文件中追加 require "pb" 做测试。 *但这时候通过protoc 转码后得到的lua
文件还不能被解析。 ##第四步 从项目中包含protobuf的 lua库 protoc-gen-lua/protobuf/这个目录下面, 还有大量的.lua
文件, 是用来
支持proto转码后的
文件解析
调用的。 不能少了这些
文件。 复制protoc-gen-lua/protobuf
文件夹 到项目中 scripts目录下。 目录结构应该是这样的: [PROJECT]/scripts/protobuf/*.lua 然后, 需要告诉框架,从哪里可以引用到它。
修改main.lua 在require("appxxxxxx") 上面 , 加入下面的
代码: package.path = package.path .. ";./protobuf/?.lua;./scripts/protobuf/?.lua;" 这个
方法, 能保证程序在被编译到手机之后仍然可以继续访问这个库。 ***千万别把转码的proto
文件放到[PROJECT]/scripts/protobuf 目录里面.不信可以试试。 现在, 项目
支持protobuf
文件的解析了。 ##第五步 重新编译player-x 如果不习惯用player-x调试, 这个步骤不是必须的。 进入player-x qt源码目录 : cd quick-cocos2d-x/player/proj.qt 使用qmake
文件执行quick-x.pro
文件 qmake ./quick-x.pro 继续: make 等待结束, 将得到的quick-x-player
文件, 放到:quick-cocos2d-x/player/bin/mac/ 目录下, 这样sublime text 装QuickXDev 扩展的直接可以用。 **如果是mac os 10.9 系统, 可能编译不过去player-x程序。 我遇到了这个问题。 会
提示错误 pb.c:28:10: fatal error: 'endian.h' file not found 如果
错误信息相同,
修改文件: ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c 查找行: #include <endian.h> 临时变更为: #include <machine/endian.h> 然后重新编译 player-x make 就足够了 make **player-x 编译完毕后, 千万要将endian.h 引用改回原来的 #include <endian.h> , 否则打包到手机的时候又回
提示文件找不到了。