Google Protocol Buffer
? 在跨平台通信协议设计中,往往需要考虑后续跨语言的支持(如Java、Python、C/C++等),需求一种序列化、反序列化的数据结构。Google Protocol Buffer 提供了一种适用于RPC、持续数据存储系统的混合语言数据标准,可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。其支持有C++、Java、Python等等多种语言的API。
Protocol Buffer 一般具有如下优点:
- 通过数据结构的定义,能够生成结构相关的接口代码
- 兼容性好,支持对现有数据结构添加新成员
- 协议文本字段自动压缩,使用二进制传输
protobuf
? protobuf是google开发的序列化库,其实现了Google Protocol Buffer定义的数据格式,并能根据文件生成代码文件,且只需要改动proto的定义就可以保持兼容,非常的灵活方便。很多公司都使用它作为接口的数据结构。
? 但是官方没给出c语言的支持,对于C语言的使用,我们需要使用另外的一个开源库protobuf-c,其实现是依赖于protobuf开源库,本文重点描述protobuf和protobuf-c的安装及其使用。
一、protobuf的编译安装
? 参考:1、https://github.com/protocolbuffers/protobuf/blob/master/src/README.md
? protobuf开源在github上,其github地址是 https://github.com/protocolbuffers/protobuf
或者下载releases版本,本文章完成时,版本为protobuf-3.17.3。
? 以下步骤及操作都是在ubuntu20上进行编译安装。
? 在编译之前,一些必要的依赖必须先安装,像autoconf、automake、libtool,gcc/g++
sudo apt-get install autoconf automake libtool gcc g++
? 具体编译步骤如下:
1、git clone https://github.com/protocolbuffers/protobuf.git
2、cd protobuf
3、./autogen.sh # 如果使用的不是git方式的源码,而是下载的release版本,已经包含gmock和configure脚本,可以略过这一步
4、./configure --prefix=/usr/local/protobuf # 指定protobuf的安装路径
5、make #编译,这一步很耗时间
6、sudo make install
7、sudo ldconfig # refresh shared library cache.
? 我们上面定义的安装目录默认情况下并不在系统路径中,需要设置一下环境变量,只设置当前用户的环境变量,我们只需要修改当前用户的home目录.bashrc文件
打开文件.bashrc,在文件的最后添加如下内容
# (动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
# (静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib
#指定protoc程序的路径
export PATH=$PATH:/usr/local/protobuf/bin
? 查看protobuf的版本信息
protoc --version
二、protobuf-c的编译安装
? protobuf-c开源地址在 https://github.com/protobuf-c/protobuf-c,
同样的,我们也可以选择下载releases版本,本文完成时的版本为protobuf-c 1.4.0。
? 以下步骤及操作都是在ubuntu20上进行编译安装。同样的, 在编译之前,也需要安装相关的软件依赖。
? 具体编译步骤如下:
1、git clone https://github.com/protobuf-c/protobuf-c.git
2、cd protobuf-c
3、./autogen.sh # 如果使用的不是git方式的源码,而是下载的release版本,已经包含gmock和configure脚本,可以略过这一步
4、./configure --prefix=/usr/local/protobuf-c # 指定protobuf-c的安装路径
5、make #编译,这一步很耗时间
6、sudo make install
7、sudo ldconfig # refresh shared library cache.
注意,这个步骤中,第4步在执行configure时,可能会报如下的错误信息
checking for protobuf... no
checking for protobuf... no
configure: error: Package requirements (protobuf >= 2.6.0) were not met:
No package ‘protobuf‘ found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables protobuf_CFLAGS
and protobuf_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
? 提示我们找不到protobuf,但事实是我们已经正确安装了,这个是因为Makefile中会用pkg-config命令检测环境变量,但是没有设置PKG_CONFIG_PATH,找不到protobuf.pc这个文件,所以只要导出这个即可
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig
此时,在重新执行第4步,得到如下结果:
protobuf-c 1.4.0
CC: gcc
CFLAGS: -g -O2
CXX: g++ -std=c++11
CXXFLAGS: -g -O2
LDFLAGS:
LIBS:
prefix: /usr/local/protobuf-c
sysconfdir: ${prefix}/etc
libdir: ${exec_prefix}/lib
includedir: ${prefix}/include
pkgconfigdir: ${libdir}/pkgconfig
bigendian: no
protobuf version: libprotoc 3.17.3
同样的,我们自定义的路径系统是没法正确找到我们的protoc-c这个程序的,我们也需要将路径写入.bashrc这个文件
打开文件.bashrc,在文件的最后添加如下内容
# (动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf-c/lib
# (静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf-c/lib
#指定protoc-c程序的路径
export PATH=$PATH:/usr/local/protobuf-c/bin
? 查看protobuf的版本信息
protoc-c --version
protobuf-c 1.4.0
libprotoc 3.17.3
本文就写到这,下篇将介绍下,如何使用protobuf,不同语言之间的使用,有可能也聊下嵌入式环境下的如何使用等等。