protobuf在linux下载编译和使用
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了protobuf在linux下载编译和使用相关的知识,希望对你有一定的参考价值。
目录
将数据序列化成二进制并报存到文件中,再将文件中的二进制数据都上来
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相关代码。
--cpp_out :在目标目录DST_DIR中产生C++代码
--java_out :在目标目录DST_DIR中产生Java代码
--python_out :在目标目录 DST_DIR 中产生Python代码
--go_out :在目标目录 DST_DIR 中产生Go代码
--ruby_out:在目标目录 DST_DIR 中产生Ruby代码
--javanano_out:在目标目录DST_DIR中生成JavaNano
--objc_out:在目标目录DST_DIR中产生Object代码
--csharp_out:在目标目录DST_DIR中产生Object代码
--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:
运行:
以上是关于protobuf在linux下载编译和使用的主要内容,如果未能解决你的问题,请参考以下文章