Google Protocol Buffers(简称 Protobuf)是一种由 Google 开发的,用于定义结构化数据并在不同的系统或编程语言之间高效地传输和存储数据。它可以看作是一种更轻量且更高效的替代方案,类似于 XML 或 JSON,但在性能和数据大小上表现更优。其使用步骤如下:
-
编写 .proto 文件:定义数据结构
-
编译 .proto 文件:使用编译器将 .proto 文件编译为目标语言代码。
-
在代码中使用生成的文件:创建和操作数据对象,实现序列化和反序列化。
-
Windows 编译安装 {#title-0} ==========================
下载 28.3 版本的 Protobuf 的源码,下面为下载链接:
https://github.com/protocolbuffers/protobuf/releases/tag/v28.3
解压之后,在 protobuf 源码的 third_party 目录下使用下面命令下载 abseil-cpp 库:
git clone https://github.com/abseil/abseil-cpp.git
使用 CMake 进行源码编译配置(参照下图),点击 Generate 生成 VS 动态库项目。
打开生成的 VS 项目,如下图所示:
接下来,在 VS 中进行编译(注意选择 Release 或 Debug 模式)。编译完成之后,在 cmd 中 cd 到前面配置的 build 目录下,使用下面的命令,将生成的 Protobuf 编译器、以及编码时使用的头文件、静态库文件安装到前面指定的安装目录下。
cmake --install .
此时,在安装目录下存在三个目录:
- bin:编译器、动态库文件
- include:头文件所在目录
- lib:动态库对应的 lib 文件
我们将 bin 目录配置到系统环境变量 PATH 中,便于在 cmd 中能够使用该命令对 .proto 文件进行编译。在 cmd 中使用下面命令验证配置是否成功:
protoc --version
- Ubuntu 编译安装 {#title-1} =========================
# 安装必要的编译工具
sudo apt g++ cmake make
# 下载 protobuf 源码
wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v28.3.zip
unzip v28.3.zip
# 下载 abseil 源码
cd protobuf-28.3/third_party
https://github.com/abseil/abseil-cpp.git
# 切换到 protobuf-28.3 目录
cd ..
mkdir build
mkdir install
# 编译配置
cmake -B build \
-DCMAKE_INSTALL_PREFIX=install \
-DCMAKE_BUILD_TYPE=Release \
-Dprotobuf_WITH_ZLIB=ON \
-Dprotobuf_BUILD_TESTS=OFF \
-Dprotobuf_BUILD_LIBPROTOC=OFF \
-Dprotobuf_BUILD_LIBUPB=OFF \
-Dprotobuf_BUILD_PROTOC_BINARIES=ON \
-Dprotobuf_BUILD_PROTOBUF_BINARIES=ON \
-Dprotobuf_BUILD_SHARED_LIBS=ON \
-DABSL_PROPAGATE_CXX_STD=ON \
-DABSL_BUILD_MONOLITHIC_SHARED_LIBS=ON
# 切换到 build 目录进行编译
make
# 在 build 目录下
cmake --install .
# 在 install 目录下会看到 bin lib include 三个需要的目录以及文件
# 编译执行
# -Wl,-rpath,/home/path/lib 指示编译器在生成的可执行文件中嵌入一个运行时库搜索路径
g++ index.cpp encode.pb.cc -I /home/chinacpp/protobuf-28.3/install/include -L /home/chinacpp/protobuf-28.3/install/lib -lprotobuf -labseil_dll -Wl,-rpath,/home/chinacpp/protobuf-28.3/install/lib
# 或者在 .bashrc 中配置 LD_LIBRARY_PATH 环境变量,以便在运行时能够找到动态库路径