1.下载相关文件
https://github.com/google/protobuf
https://github.com/sean-lin/protoc-gen-lua
https://github.com/google/protobuf/tree/v3.1.0 上把3.10 下来得到 protobuf-master
2.编译得到 protoc.exe 文件
这个文件可以在 https://github.com/google/protobuf/releases 下面有个protoc-3.1.0-win32.zip
把protoc.exe拷贝到protobuf-master/src下
这个压缩包里里面已经有编译好的 protoc.exe 文件
3.将第一步下载好的 protoc-gen-lua-master.zip 解压出来
1)在protobuf文件夹里面找到pb.c 文件,拷到工程目录并创建一个pbc_lua.h 文件
pbc/pb.c
pbc/pbc_lua.h
#ifndef PBC_LUA_H
#define PBC_LUA_H
#if __cplusplus
extern "C" {
#endif
#include <lua.h>
extern int luaopen_pb(lua_State *L);
#if __cplusplus
}
#endif
#endif
2)修改pb.c 文件
extern int luaopen_pb(lua_State *L)
#if __cplusplus
extern "C" {
#endif
#include "lualib.h"
#include "lauxlib.h"
#include "pbc_lua.h"
3)在class/AppDelegate.cpp 引入头文件,加入pb模块
<pre name="code" class="cpp">#include "pbc/pbc_lua.h"
lua_State* L = engine->getLuaStack()->getLuaState();
lua_module_register(L);
luaopen_pb(L);
4.将protoc-gen-lua-master\protobuf拷贝到src下
src/protobuf
5.在protobuf里面新建一个init.lua
require "pb"
require "wire_format"
require "type_checkers"
require "encoder"
require "decoder"
require "listener"
require "containers"
require "descriptor"
require "text_format"
require "protobuf"
6.在main.lua 顶上加上 package.path = package.path .. ";./src/protobuf/?.lua"
在require "config" 前面加上 require "protobuf.init"
7.修改encoder.lua(244):
for element in ipairs(value) do
改为
for _, element in ipairs(value) do
8.制作转换协议的批处理
1)在protobuf-master/python
下运行python setup.py build,然后再执行python setup.py install。
2)在protoc-gen-lua-master/plugin目录下编写批处理:protoc-gen-lua.bat,就下面一行代码。
@python "%~dp0protoc-gen-lua"
3)拷贝protoc.exe到protoc-gen-lua-master目录。在protoc-gen-lua-master目录编写批处理:buildproto.bat 来转换协议。
rem 切换到.proto协议所在的目录
cd ../lua
rem 将当前文件夹中的所有协议文件转换为lua文件
for %%i in (*.proto) do (
echo %%i
"..\protoc-gen-lua-master\protoc.exe" --plugin=protoc-gen-lua="..\protoc-gen-lua-master\plugin\protoc-gen-lua.bat" --lua_out=. %%i
)
echo end
pause
lua 是你存放proto的文件夹
9.嵌套多个proto不能用BUG解决
https://github.com/sean-lin/protoc-gen-lua/pull/7
还有protobuf/encoder.lua第244行改成 for _, element in ipairs(value) do
这样差不多可以使用protobuf 了!
亲测:
function MainScene:msgTest()
local person= person_pb.Person()
person.id = 10001
person.name = "ycc"
person.email = "yangchang2chen@yeah.net"
local home = person.Extensions[person_pb.Phone.phones]:add()
home.num = "2147483647"
home.type = person_pb.Phone.HOME
local data = person:SerializeToString()
local msg = person_pb.Person()
msg:ParseFromString(data)
local msg1 = msg.Extensions[person_pb.Phone.phones]
--dump(msg1,"msg1")
print("parser:", msg.id, msg.name, msg.email,msg1[1].num)
end
[LUA-print] parser: 10001,ycc,yangchang2chen@yeah.net,2147483647
原文:https://blog.csdn.net/litter_star/article/details/53022546