protobuf工程的编译以及使用
一. 获取Protocol Buffer
1.1 获得源码
Git clone之:git clone https://github.com/google/protobuf.git
或者直接下载release版本:https://github.com/google/protobuf/releases
本例选择从release下载3.7.0版本
下载并解压到目录: D:\wzx\protobuf\protobuf-3.7.0
1.2 编译protoc.exe(Windows平台)
准备工具: VS2017(包含C++模块),
提取码:jwa7
1.打开cmake目录,运行cmakegui:
D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\cmake-gui.exe
2.配置选项:
Source Code目录: D:/wzx/protobuf/protobuf-3.7.0/cmake
build the binaries目录:D:/wzx/protobuf/cmake-3.14.0-win64-x64/bin/protobuf-build
菜单栏Tools->configure,选择generator:
本例使用VS2017 64位版本,所以选择:Visual Studio 15 2017
4.点击finish,结果如下图:
5.将列表中的protobuf_BUILD_SHARED_LIBS勾上, 然后generator。
查看D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build目录,你会发现生成了一个VS工程。
3.用VS2015 编译protobuf-build工程:
双击打开D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\protobuf.sln
我们选择release来生成解决方案:
然后等待编译完成。。。速度有点慢,大概要花几分钟。
3.最后编译成功:
4.进入D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\Release, 即可看到编译的结果.
二、简单使用
1.创建一个xxx.proto文件,至于这个文件怎么写,请看链接
http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html
2.利用D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\Release 目录下的protoc.exe运行以下命令生成.cc和.h文件
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
$SRC_DIR:源地址 D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\Release $DST_DIR:目的地址 D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\Release\h
$SRC_DIR:源地址 D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\Release
3.执行之后h文件夹下面出现my.pb.cc和my.pb.h两个文件
4.把my.pb.cc、my.pb.h和libprotobuf.dll、libprotoc.dll、libprotobuf.lib、libprotoc.lib两个动态库添加到vs工程即可
期间遇到了两个问题:
1.是否忘记了向源中添加“#include "pch.h"”?
解决方案:添加头文件的引用 “#include "pch.h“,注意一定要添加到所有头文件最上面
2.无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string
解决方案:在添加的pch.h中添加#define PROTOBUF_USE_DLLS宏定义
3.属性设置:选择MT或者MTD
4.inet_ntoa函数出现:'inet_ntoa': Use inet_ntop() or InetNtop() instead or define
解决方案:文件的属性页----->c/c++--->常规,将SDL检查改为否
5.dll动态库放到工程目录或者exe目录下
6.代码编写
proto格式
message SearchRequest { required string query = ; optional int32 page_number = ; optional int32 result_per_page = ; }
通过socket实现的Tcp传输完成client到server的传输内容的序列化和反序列化
//client //使用protobuf *序列化
SearchRequest* search = new SearchRequest;
search->set_page_number();
search->set_result_per_page(); int buffsize = search->ByteSize();
void* buff = malloc(buffsize);
search->SerializeToArray(buff, buffsize);
//发送
send(sclient, (char*)buff, strlen((char*)buff), );
//server //protobuf *反序列化
SearchRequest* request = new SearchRequest;
request->ParseFromArray((void*)revData, ret); int pageNum = request->page_number();
int perPage = request->result_per_page();
protobuf工程的编译以及使用的更多相关文章
- Android工程的编译过程
现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...
- ios开发问题:添加库和复制其它工程文件编译错误问题
首先添加库问题: 选择页签Build Phases->Link Binary With Libraries点+添加库 然后command+shift+k清除历史debug的垃圾 复制其它工程文件 ...
- protobuf使用NDK编译Android的静态库(工作记录)
1.protobuf 编译过程 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功 1.1 把protobuf 压缩包解压到protobuf文件夹下 ...
- Protobuf - 使用scons编译proto文件
使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...
- 转:在支持ARC工程中编译不支持ARC的文件
转:http://blog.csdn.net/duxinfeng2010/article/details/8709697 实践总结:-fno-objc-arc 设置 解决了 旧代码中存在 releas ...
- 关于eclipse中MAVEN WEB工程中编译问题
这几天是被java的环境搞疯了,我先是搭了一个spring+springmvc+mybatis的工程,在家里跑了一下,没有问题,把工程带到公司里用,却一直不能使用. 按常理来说,只要工程发生一点变化, ...
- iOS 一个工程中引用其他工程时编译的Architecture问题
当引用了其他工程时,在编译时报错,提示你编译指令架构不对,你需要查看一下这几个工程的Architecture部分是否又冲突,比如主工程设置Valid Architecture为armv7 而 另一个子 ...
- 多文件工程的编译-Makefile的简便写法
通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理.因此我们有必要编写一个Makefile ...
- Linux c codeblock的使用(二):在工程中编译多个文件
(一)前言 我们刚开始学习linux c的时候,一般都是在一个c文件里面写完所有程序,然后用gcc编译这个c文件就好了,十分简单. 但是你有没有想过,如果我们希望将不同模块的代码放到不同的c文件,然后 ...
随机推荐
- Android Studio 学习之 Android SDK快速更新
找到国内谷歌服务器IP地址 进入http://ping.chinaz.com/输入g.cn 然后查询出最快的节点,复制下IP地址.如:IP:203.208.40.146 响应时间:3毫秒 在Andr ...
- appium 环境安装windows
创建AVD -c --sdcard : 指向一个共享的SD存储卡的路径,或者是新的SD储存卡容量大小. -n --name : AVD的名字(该项是必须的) -a --snapshot ...
- Kali-linux渗透攻击应用
前面依次介绍了Armitage.MSFCONSOLE和MSFCLI接口的概念及使用.本节将介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务.PostgreSQL数据库服务.Tomcat服务 ...
- IIs和ftp
简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件.若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文 ...
- ethereumjs/merkle-patricia-tree-2-API
SecureTrie src/secure.js:10-15 Extends Trie 扩展前缀树 You can create a secure Trie where the keys are au ...
- H.264的码率控制:CBR和VBR
CBR: Constants Bits Rate, 静态比特率. 比特率在流的进行过程中基本保持恒定并且接近目标比特率,当对复杂内容编码时质量会下降. 在流式播放方案中使用CBR编码最为有效;优点是带 ...
- eclipse安装activiti插件
参考: https://blog.csdn.net/augustaurora/article/details/59618737 https://blog.csdn.net/qq_33547950/ar ...
- everything对已经不存在的文件还进行索引,报错“系统找不到指定的驱动器”
使用everything时,总是报下面的错.也就是对于已经不存在的文件或者文件夹还保留着对应的索引. 如下图: 这个其实我们在选项中设置一下规则就可以了. 一. 二. 三. ok啦.
- iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)
很多APP都会涉及到搜索框,苹果也为我们提供了默认的搜索框UISearchBar.但实际项目中我们通常需要更改系统默认搜索框的样式.为了实现这一目标,我们需要先搞懂 UISearchBar 的属性及方 ...
- RandomAccessFile类——高效快捷地读写文件
RandomAceessFile类 RandomAccessFile类是一个专门读写文件的类,封装了基本的IO流,在读写文件内容方面比常规IO流更方便.更灵活.但也仅限于读写文件,无法像IO流一样,可 ...