Linux下C++使用Protobuf的安装步骤(vscode)

一,下载网站

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文件,编译

  1. 新建一个文件夹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 
#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

点击运行,查看结果。

思考:序列化成二进制的方式,以及如何从二进制反序列化对象结构?

你可能感兴趣的:(gzhu-c++,linux,vscode,c++)