简介
Protocol Buffers (简称 Protobuf)是 Google 开源的一款跨语言,跨平台,扩展性好的序列化工具,相比于 XML 和 JSON 等流行的编码格式,Protobuf 的性能非常高。因此,Protobuf 的编码格式(文件后缀为 .proto
)在网络开发中得到了广泛的应用,protoc 作为 Protobuf 的编译器,可以根据 Protobuf 的定义文件 .proto
生成多种语言(如:C++, Java, Go, Python 等)的类型定义文件及编解码操作代码,
这篇文章主要介绍 protoc 的安装和使用方法。
源码编译安装
官方源码:https://github.com/google/protobuf
(1) 安装依赖
如官网所列,protoc 有如下依赖:
autoconf, automake, libtool, curl, make, g++, unzip, gmock
其中 gmock 依赖于 libtool
(2)编译安装:
git clone https://github.com/google/protobuf
./autogen.sh # 生成 configure 文件
./configure
make
make check
sudo make install
sudo ldconfig
注:
安装完成之后,会在 /usr/lib 目录下生成前缀为 libprotobuf, libprotobuf-lite, libprotoc 这三类静态和动态库文件。
然后,我们需要执行 ldconfig 来更新 lib 路径。
如果上述步骤完成之后,执行 protoc 时仍发生错误的话,我们可以按如下方式手动链接
ln -s /usr/lib/libprotobuf.so.10.0.0 /usr/lib/libprotobuf.so
二进制安装
如果不想编译安装,也可以直接下载二进制包来进行安装,我们可以从 这里 直接获取编译好的 protoc 二进制文件。
比如,下载如下两个包:
protoc-3.3.0-win32.zip
protoc-3.3.0-linux-x86_64.zip
解压到 PATH 路径下即可完成安装
sudo unzip protoc-3.0.0-beta-3-linux-x86_64.zip
sudo chmod a+x protoc
查看使用帮助
protoc --help
使用示例
安装好 protoc 之后,我们可以安装官方手册上的例子来试验一下用法
1)编写 .proto
定义文件
syntax = "proto3"
package tutorial;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
- 编译
.proto
文件,生成想要的语言的定义及操作文件
比如,我们这里想要生成 C++ 的源码,那么执行:
protoc --cpp_out=. addressbook.proto
生成的文件:addressbook.pb.h, addressbook.pb.cc
- 把上述生成的
.pb.cc
文件和我们应用程序 C++ 文件进行编译
g++ addressbook.pb.cc readinput.cpp -lprotobuf
protoc 用法及选项
通过 protoc --help
可以查看使用方法
protoc 的用法格式:
protoc [OPTION] PROTO_FILES
常用选项
-IPATH, --proto_path=PATH Specify the directory in which to search for imports.
May be specified multiple times;
If not given, the current working directory is used.
--plugin=EXECUTABLE Specifies a plugin executable to use.
Normally, protoc searches the PATH for
plugins, but you may specify additional
executables not in the path using this flag.
Additionally, EXECUTABLE may be of the form
NAME=PATH, in which case the given plugin name
is mapped to the given executable even if
the executable's own name differs.
--cpp_out=OUT_DIR Generate C++ header and source.
--csharp_out=OUT_DIR Generate C# source file.
--java_out=OUT_DIR Generate Java source file.
--javanano_out=OUT_DIR Generate Java Nano source file.
--js_out=OUT_DIR Generate JavaScript source.
--objc_out=OUT_DIR Generate Objective C header and source.
--php_out=OUT_DIR Generate PHP source file.
--python_out=OUT_DIR Generate Python source file.
--ruby_out=OUT_DIR Generate Ruby source file.
例子:
protoc -I ../../protos --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ../../protos/route_guide.proto
protoc -I ../../protos --cpp_out=. ../../protos/route_guide.proto
全文完