一. 获取Protocol Buffer

1.1 获得源码

Github:ProtocolBuffer源码

  1. Git clone之:git clone https://github.com/google/protobuf.git

  2. 或者直接下载release版本:https://github.com/google/protobuf/releases

  3. 本例选择从release下载3.7.0版本

  4. 下载并解压到目录: D:\wzx\protobuf\protobuf-3.7.0

1.2 编译protoc.exe(Windows平台)

准备工具: VS2017(包含C++模块),

cmake-3.14.0-win64-x64

提取码:jwa7

   1.打开cmake目录,运行cmakegui:

     D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\cmake-gui.exe

   2.配置选项:

  1. Source Code目录: D:/wzx/protobuf/protobuf-3.7.0/cmake

  2. build the binaries目录:D:/wzx/protobuf/cmake-3.14.0-win64-x64/bin/protobuf-build

  3. 菜单栏Tools->configure,选择generator:

    1. 本例使用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工程:

  1. 双击打开D:\wzx\protobuf\cmake-3.14.0-win64-x64\bin\protobuf-build\protobuf.sln

  2. 我们选择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工程的编译以及使用的更多相关文章

  1. Android工程的编译过程

    现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...

  2. ios开发问题:添加库和复制其它工程文件编译错误问题

    首先添加库问题: 选择页签Build Phases->Link Binary With Libraries点+添加库 然后command+shift+k清除历史debug的垃圾 复制其它工程文件 ...

  3. protobuf使用NDK编译Android的静态库(工作记录)

    1.protobuf 编译过程 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功 1.1 把protobuf 压缩包解压到protobuf文件夹下 ...

  4. Protobuf - 使用scons编译proto文件

    使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...

  5. 转:在支持ARC工程中编译不支持ARC的文件

    转:http://blog.csdn.net/duxinfeng2010/article/details/8709697 实践总结:-fno-objc-arc 设置 解决了 旧代码中存在 releas ...

  6. 关于eclipse中MAVEN WEB工程中编译问题

    这几天是被java的环境搞疯了,我先是搭了一个spring+springmvc+mybatis的工程,在家里跑了一下,没有问题,把工程带到公司里用,却一直不能使用. 按常理来说,只要工程发生一点变化, ...

  7. iOS 一个工程中引用其他工程时编译的Architecture问题

    当引用了其他工程时,在编译时报错,提示你编译指令架构不对,你需要查看一下这几个工程的Architecture部分是否又冲突,比如主工程设置Valid Architecture为armv7 而 另一个子 ...

  8. 多文件工程的编译-Makefile的简便写法

    通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理.因此我们有必要编写一个Makefile ...

  9. Linux c codeblock的使用(二):在工程中编译多个文件

    (一)前言 我们刚开始学习linux c的时候,一般都是在一个c文件里面写完所有程序,然后用gcc编译这个c文件就好了,十分简单. 但是你有没有想过,如果我们希望将不同模块的代码放到不同的c文件,然后 ...

随机推荐

  1. element-ui : <el-table> 按钮点击操作阻止@row-click

    描述:<el-table> 点击行时,会跳转到一个详细信息页面, 但是同时这一行也有编辑和删除按钮. 问题: 在点击按钮时,@row-click事件也被触发了,而我并不想触发 row-cl ...

  2. csv文件的使用,csv空白行问题

    首先w+和wb区别 两者都是用于以只写方式打开指定文件指定文件原来不存在,则在打开时由系统新建一个以指定文件名命名的文件,如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一 ...

  3. 判断是否POST提交

    if(strtolower($_SERVER['REQUEST_METHOD']) == 'post'){} //判断是否POST提交

  4. PAT——1045. 快速排序(25)

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...

  5. ansible批量修改用户密码

    实现批量修改目标主机多个用户密码: --- - hosts: testchanange passwd gather_facts: false tasks: - name: change you pas ...

  6. DDL-数据类型

    一.数值型1.整型tinyint.smallint.mediumint.int/integer.bigint1         2        3          4            8 特 ...

  7. JAVA中基本类型和字符串之间的转换

    一.基本类型转换成字符串有三种方法: int c = 10; 1.使用包转类的toString()方法 String str1 = Integer.toString(c); 2.使用String类的v ...

  8. node.js中用户密码的加密

    crypro实现用户密码的加密 在实际的项目中,只要涉及到用户的信息,就是十分重要的.设想一下数据库里面存放的用户的密码是明文的形式,后果是有多严重.所以今天给大家分享一下express中怎样实现用户 ...

  9. POJ3074 Sudoku(lowbit优化搜索)

    In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...

  10. 1002. A+B for Polynomials(25)—PAT 甲级

    This time,you are supposed to find A+B where A+B are two polynomials. Input Each input file contains ...