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文件
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的同级目录下。
编写一个main.cpp
#include#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
点击运行,查看结果。
思考:序列化成二进制的方式,以及如何从二进制反序列化对象结构?