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)

然后就可以了。

 

【转载】

lua下使用protobuf

开源中国

开源中国

发表于 2014-09-12 19:43:01

下载地址: protobuf:https://code.google.com/p/protobuf/downloads/list下载最新的protobuf 我这里下载的是2.5.0 protoc-gen-lua:https://github.com/sean-lin/protoc-gen-lua下载master分支 Linux下安装: protobuf: 解压后到目录

./configure && make && sudo make install
一般protoc就会安装到/usr/local/bin下 安装python支持(Linux下可选,装也没啥问题)
cd python
python setup.py build
python setup.py install
protoc-gen-lua: 解压后到目录
cd protobuf
make
这里可能会报个lua5.1的error, 生成pb.so就OK, 无视ERROR了, 使用时请将pb.so加入package.cpath中, 也可以放在安装后lua的lib下,我的是在/usr/local/lib/lua/5.1/ 那直接将pb.so放到该目录, 以后项目也不用特别新加一句package.cpath=...了
cd /usr/local/bin && sudo ln -s /YOURPATH/protoc-gen-lua/plugin/protoc-gen-lua
这样就能使用命令
protoc --lua_out=./ foo.proto
生成lua的protobuf支持文件了 到protoc-gen-lua的example目录可以试试
protoc --lua_out=./ person.proto
这时候查看目录应该生成了一个person_pb.lua文件, 运行下测试代码
lua test.lua
查看输出 Windows下: protobuf: 解压后到目录 到目录vsprojects下打开protobuf.sln项目,编译,会在vsprojects/Debug或者vsprojects/Release生成protoc.exe执行文件, 放到某个目录加入到PATH环境变量中... 到protobuf目录下的python目录,和linux下一样安装, 请确认你的电脑安装了python,并将python执行文件所在目录加入到了PATH;python建议安装2.X最新系列 windows下安装protobuf的python支持是必须的 tips:不选中任何文件的情况下,在目录的空白位置shift+右键会出现"在此处打开命令行窗口",然后你懂的 重点是protoc-gen-lua了: github下面下载出来的文件格式是linux下的utf-8, 可能得转成PC下的GB...主要针对protoc-gen-luaprotobufpb.c windows下将pb.c几个位置改一下
#include <endian.h>
改成
#ifndef WIN32
#include <endian.h>
#else
#pragma comment(lib,"lua5.1.lib")
#endif
static int struct_unpack(lua_State *L){
函数下的
buffer += pos;

uint8_t out[8];
要改成
uint8_t out[8];

buffer += pos;
函数
int luaopen_pb(lua_State *L)
改成
__declspec(dllexport) int luaopen_pb(lua_State *L)
OK,改造完毕, VS新建项目->win32项目->下一步->应用程序类型:点选dll, 附加符号:先"导出符号", 后"空项目"->完成 将pb.c加入到项目中, 生成解决方案 到目录下会发现生成了YOURNAME.dll 将之重命名为pb.dll 如果要做到项目中都可以使用的话可以放到lua安装目录的clib下,不然自己加到package.cpath中 到protoc-gen-lua的plugin目录 建立两个脚本文件, 注意改成你自己的目录, Win下做开发就少放在含有中文的目录下了 1. build.bat
@python E:/protobuf/protoc-gen-lua/plugin/protoc-gen-lua
2.make_proto.bat
for %%i in (*.proto) do (

protoc --lua_out=./ --plugin=protoc-gen-lua="E:/protobuf/protoc-gen-lua/plugin/build.bat"%%i
)
OK, 以后就只要将这个make_proto.bat放到proto所在的目录运行下就能得到.lua的文件了 可以用example下的例子做测试 PS:关于pb.so pb.dll名称主要是protoc-gen-lua里面有个protobuf.lua的函数有个require"pb" 转载请标明出处:http://ziplee.iteye.com/blog/2078851 @HAPPY CODINE@

 

posted @ 2014-11-29 15:44  wkccs  阅读(2283)  评论(0编辑  收藏  举报