【版本说明】
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. 加入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
i
in
includes:
lua(
'local %s_PB = require("%s_pb")\n'
%
(i.upper(), i))
/
/
这一行PB大写
lua(
"module('%s_pb')\n"
%
env.filename)
|
然后就可以了。