编译Protobuf前需要先编译zlib,上官网(https://zlib.net/)下载zlib源码进行编译
一、编译Zlib
- 设置环境变量,这里就使用Qt的编译环境
set path=%path%;D:\Qt\Tools\mingw810_64\bin;D:\Qt\Tools\CMake_64\bin;
- 解压源码文件并创建临时编译目录build目录,进入build目录执行cmake。这里我指定了编译器,因为默认编译器存在冲突,你可以不必指定
CMAKE_CXX_COMPILER
和CMAKE_C_COMPILER
字段。CMAKE_INSTALL_PREFIX
字段表示安装路径。
cmake ../ -G"MinGW Makefiles" -DCMAKE_CXX_COMPILER=D:/Qt/Tools/mingw810_64/bin/g++.exe -DCMAKE_C_COMPILER=D:/Qt/Tools/mingw810_64/bin/gcc.exe -DCMAKE_INSTALL_PREFIX=D:\zlib-1.3.1
- 编译并安装
mingw32-make -j8 install
二、编译protobuf
-
下载protobuf(https://github.com/protocolbuffers/protobuf,官网:https://protobuf.dev/),下载时请注意third_party里面有很多第三方依赖需要一并下载下来
-
解压源码并创建临时编译目录build,进入build目录执行cmake。
protobuf_BUILD_TESTS
字段是否编译测试项,可关闭。ABSL_PROPAGATE_CXX_STD
字段建议打开。ZLIB_INCLUDE_DIR
字段指定zlib头文件搜索目录,ZLIB_LIBRARY
字段指示zlib库,请注意这里必须使用正斜线,不能使用反斜线。
cmake ../ -G"MinGW Makefiles" -DCMAKE_CXX_COMPILER=D:/Qt/Tools/mingw810_64/bin/g++.exe -DCMAKE_C_COMPILER=D:/Qt/Tools/mingw810_64/bin/gcc.exe -DCMAKE_INSTALL_PREFIX=D:\protobuf-25.3 -Dprotobuf_BUILD_TESTS=OFF -DABSL_PROPAGATE_CXX_STD=ON -DZLIB_INCLUDE_DIR=D:\zlib-1.3.1\include -DZLIB_LIBRARY=D:/zlib-1.3.1/lib/libzlibstatic.a
- 编译并安装
mingw32-make -j8 install
三、测试使用protobuf
- 新建文件
Person.proto
,内容如下:
syntax = "proto3";
message Person
{
int32 id = 1;
bytes name = 2;
bytes sex = 3;
int32 age = 4;
}
- 设置环境变量,并执行protoc指令解析生成c++源码文件。执行成功会生成
Person.pb.h
和Person.pb.cc
两个文件。
set path=%path%;D:\Qt\Tools\mingw810_64\bin;D:\protobuf-25.3\bin;
protoc ./Person.proto --cpp_out=./
- 创建cmake工程,CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.14)
project(untitled10 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# MinGW 8.1存在BUG,C++17无法编译通过,指定C++14版本
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(ZLIB_INCLUDE_DIR D:/zlib-1.3.1/include)
set(ZLIB_LIBRARY D:/zlib-1.3.1/lib/libzlibstatic.a)
set(absl_DIR D:/protobuf-25.3/lib/cmake/absl)
set(utf8_range_DIR D:/protobuf-25.3/lib/cmake/utf8_range)
set(Protobuf_DIR D:/protobuf-25.3/lib/cmake/protobuf)
find_package(Qt5 REQUIRED COMPONENTS Core)
#必须指定CONFIG属性
find_package(Protobuf REQUIRED CONFIG)
add_executable(untitled10
main.cxx
Person.pb.h
Person.pb.cc
)
target_link_libraries(untitled10 Qt5::Core protobuf::libprotobuf)
main.cxx如下:
#include <QCoreApplication>
#include <QDebug>
#include <google/protobuf/util/json_util.h>
#include <google/protobuf/message.h>
#include "Person.pb.h"
int main(int argc, char *argv[])
{
Person p;
p.set_id(12);
p.set_name("测试数据");
p.set_sex("男");
p.set_age(13);
// p.clear_id();
std::string str;
google::protobuf::util::JsonPrintOptions options;
options.add_whitespace = true;
auto status = google::protobuf::util::MessageToJsonString(p, &str, options);
qDebug() << status.ok() << Qt::endl << str.data();
}
- 编译并执行输出如下内容:
true
{
"id": 12,
"name": "5rWL6K+V5pWw5o2u",
"sex": "55S3",
"age": 13
}