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,否则返回falsemutable_xx
:争对string类型,这个接口返回的值可以被修改。
编译程序
因为我目前把protobuf安装在了/opt/protobuf路径下面,所以我编译如下:
- protoc –proto_path=./ –cpp_out=./ Holo.proto
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
- 踩坑日记:记得编译生成的.cc文件,还有引用.h文件【耗时1d】
- 因为运行的时候依赖了动态库,所以需要指定so库的路径—> 使用-Wl,-rpath指定运行时依赖库
3.FAQ
关于package字段,对于cpp而言,就是生成namespace的层级:
- 不能使用-
- 如果名字带有
.
,那么就会是一层新的namespace - 使用
_
不影响生成的namespace
...