protocol_buff在windows下使用mingw32编译方法

最近接手的一个项目在消息上使用了protocol_buff(以下简称protobuf),是一个挺方便的消息结构体,之前没有接触过,便记录下在windows学习过程

protobuf的简介(转自百度百科)

 

protobuf(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

protobuf的下载


protobuf源代码下载路径: http://code.google.com/p/protobuf/downloads/list (没FQ你能打开?反正我不翻打不开)
github上下载路径:https://github.com/google/protobuf

不小心下多了,把主干分支和release全下下来了,目前最新的版本是3.4.0

编译protobuf

了解过protobuf的同学们都知道protobuf使用之前要先进行编译生成protoc.exe,再用protoc.exe编译我们写的.proto类型的文件。

编译环境:win7 X64
编译器:mingw32
cmake:3.9.2
首先进入protobuf的文件中,这里我们用的protobuf版本是3.4.0版本,编译在tags/3.4.0/文件夹中进行
打开cmake-gui,
where is the source code复选框中填入3.4.0版本中的cmake文件夹(cmake文件使用的cmakelists.txt在这个文件夹中)
where to build the binaries复选框中填入cmake文件夹下的build文件夹(这个可以自己建一个build文件夹)
系统环境变量中请添加上cmake安装目录下的bin文件夹以及mingw安装目录下的bin文件夹。例如我当前的机器:D:\programfiles\cmake\bin;C:\MinGW\bin
请确保你的mingw中含有mingw32-make.exe,如果没有的话,请在cmd中执行下面的命令:
mingw-get install gcc g++ mingw32-make

 


点击configure,配置选择默认的mingw makefile巴拉巴拉什么的。。。,等待cmake自动配置,配置完成图:

点击generate,生成makefile等文件

 


生成好makefile后,到github上下载gmock以及gtest,以下文件截取自cmake文件夹下的readme文件(此处也可跳过,在cmake中增加参数protobuf_BUILD_TESTS=OFF)

下载后在protobuf文件夹中建立gmock文件夹,将gmock中的代码等拷贝到其中,再在gmock文件夹中建立gtest文件夹,将gtest文件夹中的文件拷贝到其中,如下图:

打开cmd,切换到当前目录下,执行mingw32-make命令并等待make命令运行完毕

 

我这边在运行到73%。。。检查tests依赖的时候会报错。。。还没搞清楚为什么会报错,但是tests貌似我们不用?(我是这么觉得的)看了下文件,我们需要的protoc.exe已经生成了,就先不管它了。(后来又仔细看了下makefile,原来可以在cmake中添加参数-Dprotobuf_BUILD_TESTS=OFF来关闭测试,也就不需要再下载gmock和gtest了)

已经生成了protoc.exe

.proto文件的编译


将生成好的protoc.exe文件放到写好的.proto文件路径下,并打开命令行切换到该目录下
执行命令:protoc.exe -proto_path=SRC --cpp_out=DST SRC/test.proto
参数:SRC:proto文件所在文件夹 DST:生成目标文件夹 SRC/test.proto源文件名

 

将生成的*.pb.h,*.pb.cc文件放到项目文件夹下,项目头文件引用增加protobuf/src路径,链接文佳增加在build文件夹中生成的libprotobuf.a即可编译了

附一个测试用例:


#include <iostream>
#include "test.pb.h"
using namespace std;

int main()
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
string send;
pblxtest::pblxtest test1;
pblxtest::pblxtest test2;
test1.set_name("testname");
test1.set_age(23);
cout << test1.IsInitialized() << endl;
test1.SerializeToString(&send);
cout << send << endl;
test2.ParseFromString(send);

cout << test2.name() << " " << test2.age() << endl;
return 0;
}

 

 

posted @ 2017-09-15 23:52  binary_bitcoffee  阅读(1909)  评论(0编辑  收藏  举报