一,下载网站
Releases · protocolbuffers/protobuf · GitHub
选择cpp版本,上传到linux服务器的目录,我这里上传到/home/linyu/upload
这里下载的是 protobuf-cpp-3.21.3.tar.gz 。
二,安装
在/home/linyu/upload的目录下执行以下指令:
tar -xzf protobuf-cpp-3.21.3.tar.gz
?
cd protobuf-3.21.3
#把protobuf安装到自己指定的目录
./configure --prefix=/home/linyu/include/protobuf
?
make
?
make check
?
make install
三,配置环境变量
进入到自己的目录下/home/linyu/,执行vi profile,添加以下命令到最后一行,保存退出。
#配置protoc的环境变量
export PROTOC_HOME=/home/linyu/include/protobuf
export PATH=$PROTOC_HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#因为protobuf安装到自己指定的目录,所以要指定共享库的文件目录,避免到时候找不到
export LD_LIBRARY_PATH=/home/linyu/include/protobuf/lib:$LD_LIBRARY_PATH
执行source profile以后,再执行以下的命令,查看环境变量是否配置成功:
protoc --version
四,编写proto文件,编译
-
新建一个文件夹proto,用于保存.proto文件
mkdir proto
cd proto
2. 创建一个Person.proto文件
syntax ="proto2";
?
package linyu;
?
message Person{
? optional string name=1;
? optional int32 age=2;
? enum Sex{
? ? ? ?MALE=0;
? ? ? ?FEMALE=1;
? }
? optional Sex sex=4;
}
3. 写一个编译脚本run.sh
proto_dir=./
proto_src=./src
#删掉生成文件,保证每次执行都是最新的
rm -rf src
#创建一个目录,用来保存pb.h pb.cc 让代码看起来更干净一些
mkdir src
#以c++的格式生成pb文件,*.pb.h *.pb.cc
protoc -I=$proto_dir --cpp_out=$proto_src $proto_dir/*.proto
执行脚本./run.sh,进入src目录。拷贝生成好的Person.pb.cc和Person.pb.h文件到等下要编写的程序main.cpp的同级目录下。
五,新建C++程序,使用生成好的proto文件
编写一个main.cpp
#include <iostream>
#include "Person.pb.h"
int main(int argc, char** argv)
{
? ?//创建一个Person结构
? ?linyu::Person person1;
? ?person1.set_age(25);
? ?person1.set_name("小宇");
?
? ?//将结构序列化成string
? ?std::string str = "";
? ?person1.SerializeToString(&str);
? ?std::cout << str << std::endl;
?
? ?//创建一个空结构,将person1的序列化结构(string)反序列化给person2实现值的传递
? ?linyu::Person person2;
? ?person2.ParseFromString(str);
? ?std::cout << person2.age() << " " << person2.name() << std::endl;
? ?return 0;
}
注:程序采用vscode连接上远程的linux服务器上编写C++程序。
以下两个文件需要修改一下,分别是c_cpp_properties.json和tasks.json
c_cpp_properties文件说明:
//该文件的修改主要是针对vscode不会报错,有提示等等
{
"configurations": [
{
"name": "linux-gcc-x64",
"includePath": [
"${workspaceFolder}/**",
"/home/linyu/include/",
"./"
],
"compilerPath": "/bin/gcc",
"cStandard": "${default}",
"cppStandard": "${default}",
"intelliSenseMode": "linux-gcc-x64",
"compilerArgs": [
""
]
}
],
"version": 4
}
tasks.json文件说明:
/*
"-I"指定包含的头文件目录
"-L"指令链接的库目录
"-l"指令链接的库名称
*/
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"main.cpp",
"Person.pb.cc",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I",
"/home/linyu/include",
"-I",
"/home/linyu/include/protobuf/include/",
"-L",
"/home/linyu/include/protobuf/lib/",
"-lzmq",
"-lpthread",
"-lprotobuf"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
如果采用命令行编译,则输入一下命令:
g++ -g main.cpp Person.pb.cc -o /home/linyu/zmqTest/push/main -I /home/linyu/include -I /home/linyu/include/protobuf/include/ -L /home/linyu/include/protobuf/lib/ -lzmq -lpthread -lprotobuf
点击运行,查看结果。
思考:序列化成二进制的方式,以及如何从二进制反序列化对象结构?
|