• protobuf在linux下载编译和使用


    目录

    protobuf的下载和编译:

    编写proto文件来生成对应的.cc和.h文件:

    测试

    简单的序列化与反序列化

     将数据序列化成二进制并报存到文件中,再将文件中的二进制数据都上来


    protobuf的下载和编译:

            到protobuf源码找到不同版本的压缩包,下载下来,并拉取到linux中。

            protobuf源码地址:https://github.com/protocolbuffers/protobuf

    • 查找下载不同版本的压缩包:

            进入官网点击tags,里面就有不同版本的protobuf的压缩包,选择版本,根据对应语言下载。

    • 编译protobuf,生成protoc编译器。
      • 使用tar命令解压:tar zxf protobuf-xxx
      • 进入解压后的文件夹:cd protobuf-xxx
      • 生成配置,主要是生成makefile:./configure
        • 如果没有configure文件,查找时否有autogen.sh文件,可以执行./autogen.sh,生成configure。
      • 编译:make
      • 安装到linux:make install
      • 更新动态链接为系统共享,否则时用protoc时会找不到动态库:ldconfig
    • 查看是否编译安装成功:

           执行protoc --version 显示出protobuf的版本,即编译成功。

    编写proto文件来生成对应的.cc和.h文件:

    编写的proto文件:

    ​编写生成.cc和.h脚本,使用protoc:

    • 导入目录设置

            使用--proto_path选项,后面跟需要解析的.proto文件所在目录。如果有多个目录,可以调用多次--proto_path选项。 -I 是 --proto_path的缩写。

    • 生成指定不同的代码

            上图中的--cpp_out选项,则是生成CPP相关代码。

    1. --cpp_out :在目标目录DST_DIR中产生C++代码
    2. --java_out :在目标目录DST_DIR中产生Java代码
    3. --python_out :在目标目录 DST_DIR 中产生Python代码
    4. --go_out :在目标目录 DST_DIR 中产生Go代码
    5. --ruby_out:在目标目录 DST_DIR 中产生Ruby代码
    6. --javanano_out:在目标目录DST_DIR中生成JavaNano
    7. --objc_out:在目标目录DST_DIR中产生Object代码
    8. --csharp_out:在目标目录DST_DIR中产生Object代码
    9. --php_out:在目标目录DST_DIR中产生Object代码
    • 执行脚本

            在对应目录下生成CPP可以使用的文件。

    测试

    简单的序列化与反序列化

     编写一个简单的proto文件,并用protoc生成.cc和.h文件。

     编写测试代码:

     Makefile文件:

     执行:

    注意:并非编码成字符串数据,string只是作为编码的容器。所以会有乱码出现。

    遇到的问题:

    • 需要时用c++11标准编译

    • undefined reference to `protobuf::person::PersonInfo::~PersonInfo()

            这时因为引用了protoc生成的.h和.cc文件,需要将生成的.cc文件一起编译。

    • 需要告诉编译器使用的动态库名。

    • error while loading shared libraries: libprotobuf.so.32: cannot open

            这是因为找不到libprotobuf.so.32动态库,需要将动态库的路径加到LD_LIBRARY_PATH环境变量中。

     将数据序列化成二进制并报存到文件中,再将文件中的二进制数据都上来

    fstream:对打开的文件可以进行读写操作。在构建对象时,可以打开文件,并选择打开方式读还是写,二进制方式还是文本方式。

    从文件输入,并进行序列化:

     输出到文件函数:

     主函数:

    makefile:

     运行:

     

     

     

  • 相关阅读:
    【Redis】.net core Redis事件订阅与发布,基础篇
    快速开发项目-VScode插件
    【HarmonyOS】eTS开发是否支持在data/ethernet/创建文件
    【Linux】文件系统及动静态库
    Motion Guided Region Message Passing for Video Captioning【论文阅读】
    RHEL、CentOS和Fedora之间的区别!
    Unity底层是如何处理C#的
    『computed 不生效的坑』
    破冰游戏实战流程
    2022-08-15 - 初识MySQL
  • 原文地址:https://blog.csdn.net/weixin_57023347/article/details/127082681