1.安装protobuf

2.使用proto

定义proto文件

syntax = "proto3";

//c++使用package,生成的pb.h文件的namespace
package H.O.L.O;

//go使用go_package,必须得指定,否则无法生成pb
//go_package结构:[生成pb的路径]/包名字
//最终生成的pb所在路径为:go_out_path + [生成pb的路径]
option go_package = "./mypb/package_name"; 
  
message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

编译proto

protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR path/to/file.proto

  • MPORT_PATH声明了一个.proto文件所在的具体目录。如果忽略该值,则使用当前目录。如果有多个目录则可以 对–proto_path 写多次,它们将会顺序的被访问并执行导入。-I=IMPORT_PATH是它的简化形式。
  • –cpp_out 在目标目录DST_DIR中产生C++代码,可以在C++代码生成参考中查看更多。如果DST_DIR以.zip或者.jar结尾,编译器会将输出写到一个ZIP格式文件或者符合JAR标准的.jar文件中。注意如果输出已经存在则会被覆盖,编译器还没有智能到可以追加文件。
  • 必须使用一个或多个.proto文件作为输入,多个.proto文件可以只指定一次。虽然文件路径是相对于当前目录的,每个文件必须位于其IMPORT_PATH下,以便每个文件可以确定其规范的名称。
  • DST_DIR必须是已经存在的目录,否则会报错。

API使用⭐

针对每个字段,protobuf提供了如下基本函数:

  • clear_xx:清除操作
  • set_xx:赋值操作
  • has_xx:判断是否被赋值,有被赋值,则返回true,否则返回false
  • mutable_xx:争对string类型,这个接口返回的值可以被修改。

编译程序

因为我目前把protobuf安装在了/opt/protobuf路径下面,所以我编译如下:

  1. protoc –proto_path=./ –cpp_out=./ Holo.proto
  2. g++ -std=c++11 -g main.cpp Holo.pb.cc -o main -I. -I/opt/proto/include -L/opt/proto/lib -lprotobuf -Wl,-rpath=/opt/proto/lib
    1. 踩坑日记:记得编译生成的.cc文件,还有引用.h文件【耗时1d】
  3. 因为运行的时候依赖了动态库,所以需要指定so库的路径—> 使用-Wl,-rpath指定运行时依赖库

3.FAQ

关于package字段,对于cpp而言,就是生成namespace的层级:

  • 不能使用-
  • 如果名字带有.,那么就会是一层新的namespace
  • 使用_不影响生成的namespace