lua下使用protobuf

lua下使用protobuf

博客分类:  lua
lua protobuf google windows 
下载地址: 
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: 
解压后到目录 
Shell代码   收藏代码
  1. ./configure && make && sudo make install  

一般protoc就会安装到/usr/local/bin下 

安装python支持(Linux下可选,装也没啥问题) 
Shell代码   收藏代码
  1. cd python  
  2. python setup.py build  
  3. python setup.py install  


protoc-gen-lua: 
解压后到目录 
Shell代码   收藏代码
  1. cd protobuf  
  2. make  

这里可能会报个lua5.1的error, 生成pb.so就OK, 无视ERROR了, 使用时请将pb.so加入package.cpath中, 也可以放在安装后lua的lib下,我的是在/usr/local/lib/lua/5.1/ 
那直接将pb.so放到该目录, 以后项目也不用特别新加一句package.cpath=...了 

Shell代码   收藏代码
  1. cd /usr/local/bin && sudo ln -s /YOURPATH/protoc-gen-lua/plugin/protoc-gen-lua  


这样就能使用命令 
Shell代码   收藏代码
  1. protoc --lua_out=./ foo.proto  

生成lua的protobuf支持文件了 

到protoc-gen-lua的example目录可以试试 
Shell代码   收藏代码
  1. protoc --lua_out=./ person.proto  

这时候查看目录应该生成了一个person_pb.lua文件, 

运行下测试代码 
Shell代码   收藏代码
  1. 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-lua\protobuf\pb.c 

windows下将pb.c几个位置改一下 
C代码   收藏代码
  1. #include   

改成 
C代码   收藏代码
  1. #ifndef WIN32  
  2. #include   
  3. #else  
  4. #pragma comment(lib,"lua5.1.lib")  
  5. #endif  


C代码   收藏代码
  1. static int struct_unpack(lua_State *L){  

函数下的 
C代码   收藏代码
  1. buffer += pos;  
  2.   
  3. uint8_t out[8];  

要改成 
C代码   收藏代码
  1. uint8_t out[8];  
  2.   
  3. buffer += pos;  


函数 
C代码   收藏代码
  1. int luaopen_pb(lua_State *L)  

改成 
C代码   收藏代码
  1. __declspec(dllexportint 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 
Bat代码   收藏代码
  1. @python E:/protobuf/protoc-gen-lua/plugin/protoc-gen-lua  


2.make_proto.bat 
Bat代码   收藏代码
  1. for %%i in (*.proto) do (  
  2.     protoc --lua_out=./ --plugin=protoc-gen-lua="E:/protobuf/protoc-gen-lua/plugin/build.bat" %%i  
  3. )  


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@
分享到:   
haproxy的TCP负载均衡(第4层) |  windows下grep和awk
  • 2014-06-12 17:21
  • 浏览 5406
  • 评论(5)
  • 分类:编程语言
  • 相关推荐
参考知识库
Android知识库 35557  关注 | 3137  收录
React知识库 2886  关注 | 393  收录
人工智能基础知识库 14380  关注 | 206  收录
Java 知识库 29550  关注 | 3746  收录
评论
5 楼  sjmin1987 2015-01-28  
sjmin1987 写道
Html代码   收藏代码
  1. message BidRequest {  
  2.   
  3.      required int32 version = 1;  
  4.   
  5.      message AdzInfo {  
  6.           required uint32 id = 1;   
  7.         }  
  8. }  


你这样子的,解包数据后,怎么获限AdzInfo.id

我这里怎么试也获限不到,,

请教.




已自已解决
4 楼  sjmin1987 2015-01-21  
Html代码   收藏代码
  1. message BidRequest {  
  2.   
  3.      required int32 version = 1;  
  4.   
  5.      message AdzInfo {  
  6.           required uint32 id = 1;   
  7.         }  
  8. }  


你这样子的,解包数据后,怎么获限AdzInfo.id

我这里怎么试也获限不到,,

请教.
3 楼  lizp297156486 2014-11-13  
shicheng 写道
按您的方法操作了,但是pb.c这一步一直编译不过去,但是也pb.c本身一个错误也没有报,就是报了一堆的cstdlub等c++类库的错误,不知道是我哪里有问题,求赐教,万分感谢

应该是windows标准库冲突的问题,关闭某些编译选项就行,可以贴出来一下
2 楼  shicheng 2014-11-07  
按您的方法操作了,但是pb.c这一步一直编译不过去,但是也pb.c本身一个错误也没有报,就是报了一堆的cstdlub等c++类库的错误,不知道是我哪里有问题,求赐教,万分感谢
1 楼  aigo 2014-08-05  
非常感谢楼主分享!!

你可能感兴趣的:(lua下使用protobuf)