Ubuntu16.04|Ubuntu16.04 安装protobuf C++
1、Protobuf的安装
1.1依赖环境的安装
$sudo apt-get install autoconf automake libtool curl make g++ unzip
1.2下载 protobuf源码下载
github源代码下载地址:https://github.com/google/protobuf
git clone https://github.com/protocolbuffers/protobuf.git
1.3 进入目录配置autogen/configure
cd protobuf
./autogen.sh
./configure --prefix=/usr/local/protobuf
这个地方如果出现了警告configure: WARNING: no configuration information is in third_party/googletest就需要注意了,这个warning需要解决的,不然后面编译不过
搜索答案发现需要讲googletest下载最新版本 然后放在 thrid/googletest目录下,并且重新命名为googletest(就是删除后面的版本号),tar.gz下载地址:https://github.com/google/googletest/archive/release-1.8.1.tar.gz但是我没有成功,于是尝试一下方法:
如果下载不完整,使用:
git submodule update --init --recursive
【Ubuntu16.04|Ubuntu16.04 安装protobuf C++】然后再来一遍:
./autogen.sh
./configure --prefix=/usr/local/protobuf
1.4 编译make
make -j4
1.5 make check
make check
如果没有报错 那就是成功了,可以安装了
1.6 安装
sudo make install
提示:如果安装了两次、最好使用witch查找一下、不然有可能编译的时候各种define找不到
1.7 检测安装是否成功
~$ protoc --version
libprotoc 2.6.1
2 测试 proto文件的编写方法就是类似于定义一个class / struct(随便怎么理解)存储需要序列化的数据,再把这个数据序列化进行传输,然后反序列化解读出来。
2.1 编写.proto文件
message xxx {
// 字段规则:required -> 字段只能也必须出现 1 次
// 字段规则:optional -> 字段可出现 0 次或1次
// 字段规则:repeated -> 字段可出现任意多次(包括 0)
// 类型:int32、int64、sint32、sint64、string、32-bit ....
// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
字段规则 类型 名称 = 字段编号;
}
例如:
//helloworld.proto
package lm;
message People {
required string str = 1;
required int32 id = 2;
optional string email = 3;
}
name 是 required修饰,必须出现一次
id 是required修饰,所以必须出现一次
email是optional修饰,可以出现一次或0次
具体使用看看:官方文档C++
2.2 生成proto的读写借口文件
c++为例:生成的对应文件是xxx.pb.cc 和 xxx.pb.h文件
生成命令:
// $SRC_DIR: .proto 所在的源目录
// --cpp_out: 生成 c++ 代码
// $DST_DIR: 生成代码的目标目录
// xxx.proto: 要针对哪个 proto 文件生成接口代码
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
通过tree来查看目录可以发现结构如下:
.
├── helloworld.pb.cc
├── helloworld.pb.h
└── helloworld.proto
2.3编译链接proto的读写文件
这个时候才是重点,之前在这里卡了很久,主要是安装了两次make install两次protobuf,一次是./configure --prefix=/usr/local/protobuf另一次 ./cpmfigure 导致有两个protobuf本地库被安装,所以链接的时候出问题了,最后百度了一下删除protobuf了重新来就好了,这里贴一下删除protobuf的方法:
sudo apt-get remove libprotobuf-devwhich protoc找到文件位置,比如是/usr/local/bin/protoc。执行sudo rm /usr/local/bin/protoc就可以了。
// main.cpp
#include
#include
#include
#include
#include
#include
#include #include
#include "helloworld.pb.h"#define BUFFSIZE 1024
using namespace std;
int main()
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
lm::helloworld msg1;
msg1.set_id(1);
msg1.set_str("test1");
fstream output("./log", ios::out | ios::trunc | ios::binary);
if (!msg1.SerializeToOstream(&output)) {
cerr << "Failed to write msg." << endl;
return -1;
}
output.close();
cout << msg1.id() << endl;
cout << msg1.str() << endl;
}
链接方法:
g++ helloworld.pb.cc main.cpp -lprotobuf -lpthread -std=c++11
常见错误:undefined reference to`pthread_once' 。解决方法 不要忘记使用-lpthread
常见错误:error: ‘static_assert’ was not declared in this scope。解决方法 -std=c++11
文件目录如下:
.
├── a.out
├── helloworld.pb.cc
├── helloworld.pb.h
├── helloworld.proto
└── main.cpp
运行./a.out
推荐阅读
- Mac安装Chromedriver
- MongoDB,Wondows下免安装版|MongoDB,Wondows下免安装版 (简化版操作)
- MAC安装Mongo
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- react|react 安装
- VueX--VUE核心插件
- python-安装sublime遇到异常
- typeScript入门基础介绍
- 监控nginx
- 使用homeBrew|使用homeBrew 安装Goland