cocos2d-x中集成protoc-gen-lua

【版本说明】

python:2.7.5

protobuf:2.5.0

lua:5.1.5

protoc-gen-lua:latest

cocos2d-x:3.2

 

【安装步骤】

1. python/lua/cocos2d-x环境默认已安装

安装protobuf

进入protobuf-2.5.0\python,执行:

1
2
3
python setup.py build
python setup.py test
python setup.py install

2. protoc-gen-lua解压放置到某个目录下,假定为c:\

protoc-gen-lua\plugin下创建protoc-gen-lua.bat,文件内容为:

1
python c:\protoc - gen - lua\plugin\protoc - gen - lua

3. 通过proto生成lua,命令为:

 
1
protoc  - - lua_out = . /  - - plugin = protoc - gen - lua = "c:\protoc-gen-lua\plugin\protoc-gen-lua.bat"  person.proto

【集成步骤】

1. 加入pb.c文件,在frameworks\cocos2d-x\external\lua下创建protobuf目录,copy pb.c文件至此

win32下编译出错,修改pb.c文件如下:

1
2
3
#ifndef _WIN32  //添加
#include <endian.h>
#endif //添加

 

2. protobuf目录下加入pb.h文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __LUA_PROTOBUF_H_
#define __LUA_PROTOBUF_H_
  
#include "lua.h"
  
#if __cplusplus
extern  "C"  {
#endif
     int  luaopen_pb(lua_State  * L);
#if __cplusplus
}
#endif
  
#endif

 

3. 修改lua_extensions.c文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#if __cplusplus
extern  "C"  {
#endif
/ /  socket
#include "luasocket/luasocket.h"
#include "luasocket/mime.h"
#include "lpack/lpack.h"
#include "cjson/lua_cjson.h"
#include "protobuf/pb.h" //添加
  
static luaL_Reg luax_exts[]  =  {
     { "cjson" , luaopen_cjson_safe},
     { "pack" , luaopen_pack},
     { "pb" , luaopen_pb},   / / 添加
     { "socket.core" , luaopen_socket_core},
     { "mime.core" , luaopen_mime_core},
     {NULL, NULL}
};

4. 将protoc-gen-lua\protobuf下的lua文件放置到项目的搜索目录中

 

【重要说明】

protoc-gen-lua这个坑爹的玩意儿不支持嵌套message,如果嵌套的message在同一个proto里面是可以的,但是如果在不同的文件里面,通过import的方式引用就有问题了。

 

可以通过修改生成lua的python脚本解决这个问题,方法如下:

1. 首先定义的被引用的proto文件头要加上package,如:

 

1
2
3
4
5
package pb;
 
message BaseMsg {
...
}

2.在引用的proto文件中修改为这样:

1
2
3
4
5
6
import  "Base.proto"
 
message PlayerMsg {
     optional pb.BaseMsg msg  =  1 ;
     ...
}

3.修改protoc-gen-lua\plugin\protoc-gen-lua文件:

1
2
3
if  field_desc.HasField( 'type_name' ):
        type_name  =  env.get_ref_name(field_desc.type_name).upper()  / / 这一行
        if  field_desc. type  = =  FDP.TYPE_MESSAGE:
1
2
3
4
5
6
7
def  code_gen_message(message_descriptor, env, containing_type  =  None ):
     env.enter(message_descriptor.name)
     full_name  =  env.get_local_name()
     obj_name  =  full_name.upper().replace( '.' '_' )
     env.descriptor.append(
         "%s = protobuf.Descriptor();\n" %  obj_name   / / 这一行去掉local
     )
1
2
3
4
5
6
7
if  is_gen:
        lua  =  Writer()
        write_header(lua)
        lua( 'local protobuf = require "protobuf"\n' )
        for  in  includes:
            lua( 'local %s_PB = require("%s_pb")\n'  %  (i.upper(), i))   / / 这一行PB大写
        lua( "module('%s_pb')\n"  %  env.filename)

然后就可以了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值