Ubuntu protobuf编译安装并在Qt中使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu protobuf编译安装并在Qt中使用相关的知识,希望对你有一定的参考价值。


一,编译protobuf

首先去github下载最新protobuf的C++的relaease版本:

​release链接​​​ 这里我下载的是​​v3.17.3​

解压到任意文件夹,进入文件夹:

Ubuntu


编译安装官方提供的有​​教程​

执行如下命令进行编译安装:

安装在/usr/local/protobuf

./configure --prefix=/usr/local/protobuf
make
make check
sudo make install
sudo ldconfig

执行完make install,protobuf的头文件和lib文件则被成功的复制在 /usr/local/protobuf路径下
此时在终端输入如下命令,如果有对应输出则证明编译成功:

protoc

Ubuntu


将动态库添加到环境变量:

vi ~/.bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib
export PATH=$PATH:/usr/local/protobuf/bin

二,创建.proto文件

.proto作为协议文件进行序列化与反序列化数据
我这里创建了一个robotdata.proto的文件,具体解释在注释中:

syntax = "proto3";

option optimize_for = LITE_RUNTIME;
//命名空间
package robot_data;

//点数据类型
message Point
double x = 1;
double y = 2;
double theta = 3;

//激光数据类型
message LaserData
sint32 location = 1;
int64 timeStamp = 2;
repeated Point scan = 3;

//路径数据类型
message RobotPath
sint32 location = 1;
int64 timeStamp = 2;
repeated Point path = 3;

//机器人数据
message RobotData
oneof Item
LaserData laser_data = 1;
RobotPath robot_path =2;

三,生成protobuf的头文件以及cpp文件:

在.proto路径下打开终端,运行如下命令 :
​​​protoc -I=./ --cpp_out=./ ./*.proto​

-cpp_out指明生成的类文件存放位置
-I 如果多个proto文件之间有互相依赖,生成某个proto文件时,需要import其他几个proto文件,这时候就要用-I来指定搜索目录

./*.proto 生成当前目录下的所有.proto文件

运行命令即可生成.cc文件与.h文件:

Ubuntu

四,qt导入protobuf库:

如果刚才make install的时候没有改变库的安装目录的话,也就是install在/usr/local目录下
在qt项目.pro文件新增如下两句:

INCLUDEPATH += /usr/local/include/google/protobuf
LIBS += -L /usr/local/lib -lprotobuf

Ubuntu


将刚才生成的.cc和.h添加到项目:

分别在header和source目录右键,点击添加现有文件,将.h文件和.cc文件分别加入项目:

Ubuntu


Ubuntu

五,使用protobuf序列化

导入头文件:

#include "robotdata.pb.h"

使用如下代码序列化并查看序列化结果:

//添加laser数据
robot_data::LaserData *laser_data = dataGrame.mutable_laser_data();
robot_data::Point *point;
laser_data->set_location(-1);
laser_data->set_timestamp(1001);
for(int i=0;i<100;i++)
point = laser_data->add_scan();
point->set_x(0.5);
point->set_y(1.6);
point->set_theta(10);

//序列化
std::string binary = dataGrame.SerializeAsString();
QByteArray byte(binary.c_str(),binary.size());

qDebug()<<"byte: "<<byte.toHex( );
qDebug()<<"byte size:"<<byte.size()<<" "<<binary.size();

Ubuntu

六,使用protobuf反序列化

//反序列化
if (false == redataGrame.ParseFromString(binary))
qDebug()<<"反序列化失败!";
else
if(redataGrame.has_laser_data())
qDebug()<<"反序列化laser location:"<<redataGrame.mutable_laser_data()->location();
qDebug()<<"反序列化laser timestamp:"<<redataGrame.mutable_laser_data()->timestamp();
for(int i=0;i<redataGrame.mutable_laser_data()->scan_size();i++)
qDebug()<<redataGrame.mutable_laser_data()->scan(i).x()<<redataGrame.mutable_laser_data()->scan(i).y();

else
qDebug()<<"无 laser data";

Ubuntu

完整demo地址​​github​



ubuntu17.10 caffe 编译安装的坑

caffe install

  1. 安装依赖包
  2. 下载源码,修改 Makefile.config
  3. make all
  4. ...

上面进行make all 操作的时候出现 protobuf版本不对,查资料发现caffe支持的是protobuf2.6, 而我的ubuntu17.10上面是3.5~~.

 protoc --version
 libprotoc 3.5.0

解决方法:重新按安装protobuf2.6版本,下面是(Build Caffe and pycaffe #5078)[https://github.com/BVLC/caffe/issues/5078]中给出的参考

We have the same problem...and it is because of the wrong version of protobuf
首先你要卸载,并重装其要求的protobuf版本(2.6.1),之后重新编译就好了
我卸载了protobuf3.0,重新安装了很多次的protobuf2.6.1,但都不行
重装后:protoc --version 结果还是3.0
如果你也这样,你需要的工作是:
1。sudo find / -name protoc
2。将2.6.1版本生成的protoc,替换掉找到的3.0版本的protoc
然后就ok了
我整整搞了两天
good luck

参考

  1. Build Caffe and pycaffe #5078

  2. protobuf2.6编译

  3. https://askubuntu.com/questions/629654/building-caffe-failed-to-see-hdf5-h

以上是关于Ubuntu protobuf编译安装并在Qt中使用的主要内容,如果未能解决你的问题,请参考以下文章

[ubuntu]ubuntu18.04上源码编译protobuf

ubuntu17.10 caffe 编译安装的坑

QT中使用MinGW 编译的protobuf库--包含库的生成和使用

[C++][ubuntu]MNN在ubuntu18.04源码编译流程

如何在ubuntu下搭建qt交叉编译环境

ubuntu QT安装以及配置交叉编译环境