在https://code.google.com/p/protoc-gen-lua/ 下载网易兄弟写的lua的protobuf插件(网易都把pb给弄完了,as3的也是他们写的..)
编译python版的protobuf模块
在https://code.google.com/p/protobuf/downloads/list 下载官方的原生版本protobuf, 这里发文时使用的是2.4.1版本
编译出protoc执行文件, 放一份在protobuf-2.4.1\src\下
下载python2.7版本, 在protobuf-2.4.1\python下运行python setup.py install(如果找不到python请给python绝对路径)
这一步, python会下一个蛋( 真的是一个python的egg文件 ), 然后编译出python版本的protobuf模块放置在python下
制作protoc-gen-lua的批处理
放一份protoc在protoc-gen-lua的plugin目录
编写批处理:protoc-gen-lua.bat
@python "%~dp0protoc-gen-lua"
协议目录生成脚本
在你需要放置协议的目录编写如下批处理
buildproto.bat
rd /S /Q .\%1%
"..\..\src\protoc-gen-lua\plugin\protoc.exe" --plugin=protoc-gen-lua="..\..\src\protoc-gen-lua\plugin\protoc-gen-lua.bat" --lua_out=. %1%.proto
注意protoc.exe及protoc-gen-lua.bat的路径符合你的路径
再编写要编译的proto协议的批处理generate.bat
call buildproto.bat loginsvc
执行generate.bat后, 将会编译同目录下的loginsvc.proto,输出loginsvc_pb.lua
编译链接lua的pb库
将protoc-gen-lua\protobuf\目录拷贝到之前的协议目录
将其下的pb.c链入你的工程, 注意VS2010的VC下需要修改源码
1.将 #include 修改为
#ifndef _WIN32
#include
#endif
避免在windows下缺失文件报错.
2. 调整struct_unpack函数前几行为
static int struct_unpack(lua_State *L)
{
uint8_t format = luaL_checkinteger(L, 1);
size_t len;
const uint8_t* buffer = (uint8_t*)luaL_checklstring(L, 2, &len);
size_t pos = luaL_checkinteger(L, 3);
uint8_t out[8];
buffer += pos;
避免VS2010的VC编译器过于标准, 严格要求C风格函数变量前置声明
在lua_State声明后添加如下代码
extern "C" { int luaopen_pb (lua_State *L);} // 注意防在命名空间外的全局声明
luaopen_pb( L ); // 直接注入全局pb, 避免动态加载pb.dll造成的一系列跨平台问题
lua中使用pb
local loginsvc_pb = require “loginsvc_pb”
local REQ = loginsvc_pb.CheckVersionREQ()
local Data = REQ:SerializeToString( )
local ACK = loginsvc_pb.CheckVersionACK()
ACK:ParseFromString( Data )
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
我的工程目录
script\
protobuf\
buildproto.bat
generate.bat
loginsvc_pb.lua
loginsvc.proto
Main.lua
src\
protoc-gen-lua\
example\
plugin\
protobuf\
posted on 2013-04-24 15:44 战魂小筑 阅读(7740) 评论(4) 编辑 收藏 引用 所属分类: 脚本技术 、C++/ 编程语言
评论
# re: Lua使用protocolbuf 2013-05-18 13:14 何茂龙
这样子生成的代码不支持嵌套其他proto的message
不知道是用法不对还是怎么样。
如果把所有proto都写到一个文件就太麻烦了 回复 更多评论
# re: Lua使用protocolbuf 2013-06-25 10:37 战魂小筑
@何茂龙
使用bytes 手动解析下, 可以对消息间互相嵌套进行降耦
回复 更多评论
# re: Lua使用protocolbuf 2013-09-06 20:32 myth
@战魂小筑
如何用bytes 手动解析? 回复 更多评论
# re: Lua使用protocolbuf 2014-05-25 02:44 xgg
这样子生成的代码不支持嵌套其他proto的message
这个问题解决了吗?我也遇到这个问题了~~ 回复 更多评论