Lua Protobuf

作者:追风剑情 发布于:2019-1-30 14:27 分类:Unity3d

在使用protoc-gen-lua前,先确保电脑上已经安装了Python2.x以及Protobuf

Python安装Protobuf

一、下载protoc-gen-lua

https://github.com/sean-lin/protoc-gen-lua

二、写两个批处理文件

111.png


  1. python %~dp0protoc-gen-lua


2222.png


  1. cd ./example
  2. for %%i in (*.proto) do (
  3. echo %%i
  4. protoc --plugin=protoc-gen-lua="..\plugin\protoc-gen-lua.bat" --lua_out=. %%i
  5. )
  6. echo end
  7. pause


二、运行protoc.bat

3333.png

此时已经通过person.proto生成了一个person_pb.lua文件

4444.png

问题1:如果未生成person_pb.lua文件,但cmd中输出是正确的,可以修改下Plugin\protoc-gen-lua文件

5555.png

问题2:下载的person.proto没声明版本号可能会导致编译报错,需要自己加上。

6666.png


下面贴出生成的person_pb.lua文件内容


  1. -- Generated By protoc-gen-lua Do not Edit
  2. local protobuf = require "protobuf"
  3. module('person_pb')
  4.  
  5.  
  6. local PERSON = protobuf.Descriptor();
  7. local PERSON_ID_FIELD = protobuf.FieldDescriptor();
  8. local PERSON_NAME_FIELD = protobuf.FieldDescriptor();
  9. local PERSON_EMAIL_FIELD = protobuf.FieldDescriptor();
  10. local PHONE = protobuf.Descriptor();
  11. local PHONE_PHONE_TYPE = protobuf.EnumDescriptor();
  12. local PHONE_PHONE_TYPE_MOBILE_ENUM = protobuf.EnumValueDescriptor();
  13. local PHONE_PHONE_TYPE_HOME_ENUM = protobuf.EnumValueDescriptor();
  14. local PHONE_NUM_FIELD = protobuf.FieldDescriptor();
  15. local PHONE_TYPE_FIELD = protobuf.FieldDescriptor();
  16. local PHONE_PHONES_FIELD = protobuf.FieldDescriptor();
  17.  
  18. PERSON_ID_FIELD.name = "id"
  19. PERSON_ID_FIELD.full_name = ".Person.id"
  20. PERSON_ID_FIELD.number = 1
  21. PERSON_ID_FIELD.index = 0
  22. PERSON_ID_FIELD.label = 2
  23. PERSON_ID_FIELD.has_default_value = false
  24. PERSON_ID_FIELD.default_value = 0
  25. PERSON_ID_FIELD.type = 5
  26. PERSON_ID_FIELD.cpp_type = 1
  27.  
  28. PERSON_NAME_FIELD.name = "name"
  29. PERSON_NAME_FIELD.full_name = ".Person.name"
  30. PERSON_NAME_FIELD.number = 2
  31. PERSON_NAME_FIELD.index = 1
  32. PERSON_NAME_FIELD.label = 2
  33. PERSON_NAME_FIELD.has_default_value = false
  34. PERSON_NAME_FIELD.default_value = ""
  35. PERSON_NAME_FIELD.type = 9
  36. PERSON_NAME_FIELD.cpp_type = 9
  37.  
  38. PERSON_EMAIL_FIELD.name = "email"
  39. PERSON_EMAIL_FIELD.full_name = ".Person.email"
  40. PERSON_EMAIL_FIELD.number = 3
  41. PERSON_EMAIL_FIELD.index = 2
  42. PERSON_EMAIL_FIELD.label = 1
  43. PERSON_EMAIL_FIELD.has_default_value = false
  44. PERSON_EMAIL_FIELD.default_value = ""
  45. PERSON_EMAIL_FIELD.type = 9
  46. PERSON_EMAIL_FIELD.cpp_type = 9
  47.  
  48. PERSON.name = "Person"
  49. PERSON.full_name = ".Person"
  50. PERSON.nested_types = {}
  51. PERSON.enum_types = {}
  52. PERSON.fields = {PERSON_ID_FIELD, PERSON_NAME_FIELD, PERSON_EMAIL_FIELD}
  53. PERSON.is_extendable = true
  54. PERSON.extensions = {}
  55. PHONE_PHONE_TYPE_MOBILE_ENUM.name = "MOBILE"
  56. PHONE_PHONE_TYPE_MOBILE_ENUM.index = 0
  57. PHONE_PHONE_TYPE_MOBILE_ENUM.number = 1
  58. PHONE_PHONE_TYPE_HOME_ENUM.name = "HOME"
  59. PHONE_PHONE_TYPE_HOME_ENUM.index = 1
  60. PHONE_PHONE_TYPE_HOME_ENUM.number = 2
  61. PHONE_PHONE_TYPE.name = "PHONE_TYPE"
  62. PHONE_PHONE_TYPE.full_name = ".Phone.PHONE_TYPE"
  63. PHONE_PHONE_TYPE.values = {PHONE_PHONE_TYPE_MOBILE_ENUM,PHONE_PHONE_TYPE_HOME_ENUM}
  64. PHONE_NUM_FIELD.name = "num"
  65. PHONE_NUM_FIELD.full_name = ".Phone.num"
  66. PHONE_NUM_FIELD.number = 1
  67. PHONE_NUM_FIELD.index = 0
  68. PHONE_NUM_FIELD.label = 1
  69. PHONE_NUM_FIELD.has_default_value = false
  70. PHONE_NUM_FIELD.default_value = ""
  71. PHONE_NUM_FIELD.type = 9
  72. PHONE_NUM_FIELD.cpp_type = 9
  73.  
  74. PHONE_TYPE_FIELD.name = "type"
  75. PHONE_TYPE_FIELD.full_name = ".Phone.type"
  76. PHONE_TYPE_FIELD.number = 2
  77. PHONE_TYPE_FIELD.index = 1
  78. PHONE_TYPE_FIELD.label = 1
  79. PHONE_TYPE_FIELD.has_default_value = false
  80. PHONE_TYPE_FIELD.default_value = nil
  81. PHONE_TYPE_FIELD.enum_type = PHONE_PHONE_TYPE
  82. PHONE_TYPE_FIELD.type = 14
  83. PHONE_TYPE_FIELD.cpp_type = 8
  84.  
  85. PHONE_PHONES_FIELD.name = "phones"
  86. PHONE_PHONES_FIELD.full_name = ".Phone.phones"
  87. PHONE_PHONES_FIELD.number = 10
  88. PHONE_PHONES_FIELD.index = 0
  89. PHONE_PHONES_FIELD.label = 3
  90. PHONE_PHONES_FIELD.has_default_value = false
  91. PHONE_PHONES_FIELD.default_value = {}
  92. PHONE_PHONES_FIELD.message_type = PHONE
  93. PHONE_PHONES_FIELD.type = 11
  94. PHONE_PHONES_FIELD.cpp_type = 10
  95.  
  96. PHONE.name = "Phone"
  97. PHONE.full_name = ".Phone"
  98. PHONE.nested_types = {}
  99. PHONE.enum_types = {PHONE_PHONE_TYPE}
  100. PHONE.fields = {PHONE_NUM_FIELD, PHONE_TYPE_FIELD}
  101. PHONE.is_extendable = false
  102. PHONE.extensions = {PHONE_PHONES_FIELD}
  103.  
  104. Person = protobuf.Message(PERSON)
  105. Phone = protobuf.Message(PHONE)
  106.  
  107. Person.RegisterExtension(PHONE_PHONES_FIELD)


三、gcc编译pb.c为对应平台的库文件

windows平台,编译成pb.dll

1、下载min-gw工具

https://sourceforge.net/projects/mingw/files/

2、安装min-gw

99999.png

8888.png

3、{安装目录}\MinGW\bin 将此目录配到环境变量Path中

4、在cmd中输入mingw-get,回车。若能弹出min-gw管理界面,则说明安装成功

5、安装gcc编译器

7777.png

gcc参数详解 https://www.cnblogs.com/zhangsir6/articles/2956798.html

6、安装mingw32-make

6666.png

四、直接利用Visual Studio编译pb.c

1、将pc.c文件导入到Visual Studio工程中

1111.png

2222.png

2、引用Lua的静态链接库

2222.png

3、pb.c上点右键->属性

44444.png

生成dll

333.png

问题: 如果报以下错

1111.png

解决方法: 检查有没正确引用Lua的静态连接库

更多参考

编译Lua源代码

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号