加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x中集成protoc-gen-lua

发布时间:2020-12-14 17:12:45 所属栏目:百科 来源:网络整理
导读:【版本说明】 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.0python,执行: 1 2 3 python setup.py build python setup.py test

【版本说明】

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.0python,执行:

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

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

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

1
python c:protoc - gen luapluginprotoc lua

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

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

【集成步骤】

1. 加入pb.c文件,在frameworkscocos2d-xexternallua下创建protobuf目录,copy pb.c文件至此

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

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

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

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文件:

14
15
16
17
18
#if __cplusplus
{
#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" "pb" 添加
"socket.core" "mime.core" {NULL,NULL}
};

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

【重要说明】

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

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

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

5
package pb;
message BaseMsg {
...
}

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

6
import "Base.proto"
message PlayerMsg {
optional pb.BaseMsg msg = 1 ;
...
3.修改protoc-gen-luapluginprotoc-gen-lua文件:

if field_desc.HasField( 'type_name' ):
type_name env.get_ref_name(field_desc.type_name).upper() 这一行
field_desc. type = FDP.TYPE_MESSAGE:
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" % 这一行去掉local
)
is_gen:
lua Writer()
write_header(lua)
lua( 'local protobuf = require "protobuf"n' for i in includes:
'local %s_PB = require("%s_pb")n' (i.upper(),i)) 这一行PB大写
"module('%s_pb')n" env.filename)

然后就可以了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

相关内容
推荐文章
站长推荐
热点阅读