Protocol Buffer学习教程之编译器与类文件(三)

1. 概述

在前面两篇中,介绍了Protobuf的基本概念、应用场景、与protobuf的语法等。在此篇中将介绍如何自己编译protobuf的库,不同Visual Studio之间的protobuf库一般不能通用,会有兼容性问题,下面我们将讲解,如何获取对应Visual Studio版本的protobuf库与编译器。

2. 环境准备

编译protobuf需要工具CMake(下载链接)与Visual Studio 2012版本或者更高版本(下载链接)。下载CMake的Windows版本,安装后在命令行中输入CMake命令,如果提示相关用法,说明安装CMake成功,如下:

关于Visual Studio的安装在此不作讲解。

Protobuf源码的下载,参见《Protocol Buffer学习教程之开篇概述(一)》。

3. 编译源码

打开Protobuf源码下的Cmake\Readme.md文件,此文件将详细介绍编译库文件的步骤。

以VS2015为例,在开始菜单中找到VS2015 x64 Native Tools Command Prompt工具,打开工具,如图:

然后进入到protobuf文件的cmake目录,然后创建build目录,并进入build目录:

C:\Path\to\protobuf\cmake>mkdir build & cd build

C:\Path\to\protobuf\cmake\build>

配置release版本:再在build目录创建release目录,并进入到release目录,关执行cmake命令:

C:\Path\to\protobuf\cmake\build>mkdir release & cd release

C:\Path\to\protobuf\cmake\build\release>cmake -G "NMake Makefiles" ^

-DCMAKE_BUILD_TYPE=Release ^

-DCMAKE_INSTALL_PREFIX=../../../../install ^

../..

配置debug版本:回到build目录,再在build目录创建debug目录,并进入到debug目录,关执行cmake命令:

C:\Path\to\protobuf\cmake\build>mkdir debug & cd debug

C:\Path\to\protobuf\cmake\build\debug>cmake -G "NMake Makefiles" ^

-DCMAKE_BUILD_TYPE=Debug ^

-DCMAKE_INSTALL_PREFIX=../../../../install ^

../..

生成Visual Studio工程文件:回到上一级目录,创建solution目录,然后进入到此目录,此步骤很关键,通过此命令来生成不同版本的工程,在命令窗口输入cmake --help命令,来查看相关的参数,支持生成的VS工程版本。执行以下文件:

C:\Path\to\protobuf\cmake\build>mkdir solution & cd solution

C:\Path\to\protobuf\cmake\build\solution>cmake -G "Visual Studio 12 2013 Win64" ^

-DCMAKE_INSTALL_PREFIX=../../../../install ^

../.. -Dprotobuf_BUILD_TESTS=OFF

生成32位的话,把命令中的Win64去掉,要生成不同版本的VS工程的话,修改“Visual Studio 12 2013”。

最后编译库:release版本,执行命令:

C:\Path\to\protobuf\cmake\build\release>nmake

Debug版本,执行命令:

C:\Path\to\protobuf\cmake\build\debug>nmake

或者直接用VS打开solution目录下的工程编译即可。

4.测试生成的编译器

生成自己的类

如果想把你的proto文件生成Java,Python或者C++代码,你需要通过protoc编译器来编译proto文件,如果没有安装proto编译器,可以从下载download the package下载后,根据README文件的步骤处理即可。

编译器使用方法如下,发命令窗口输入如下格式命令:

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/to/file.proto

protoc为编译器。以cmd窗口输入完整路径,或者直接把proto执行文件拖拽进入cmd窗口即可。

IMPORT_PATH为被包含文件的查找路径,如被编译的proto文件有import指令时,需要查找被包含的文件,就是通过此参数指定的路径来查找。如果有多个目录,可以通过--proto_path多次指定,编译器将按顺序查找。-I=IMPORT_PAT

H为—proto_path的简写。

你可以提供一个或者多个文件输出路径

--cpp_out指在DST_DIR目录下生成C++代码,更多内容参见C++ generated code reference

--java_out指在DST_DIR目录下生成java代码,更多内容参见Java generated code reference

--python_out指在DST_DIR目录下生成python代码,更多内容参见Python generated code reference

作为额外的约定,DST_DIR如果以.zip或者.jar结尾的话,编译器将输入一个.zip格式文件,.jar的话将输出一个java jar声明必须的manifest文件。如果归档文件已经存在的话,将被覆盖。

一次可以指定多个.proto文件作为输入文件,但是必须每个文件用IMPORT_

PATH格式引入,尽管所有文件都在同一目录下也一

Protocol Buffer学习教程之编译器与类文件(三)的更多相关文章

  1. Protocol Buffer学习教程之类库应用(四)

    Protocol Buffer学习教程之类库应用(四) 此教程是通过一个简单的示例,给C++开发者介绍一下如何使用protocol buffers编程,主要包括以下几部分: 定义一个.proto文件 ...

  2. Protocol Buffer学习教程之语法手册(二)

    1.说明 此向导介绍如何使用protocol buffer language创建一个自己的protocolbuffer文件,包括语法与如何通过“.proto”文件生成数据访问的类,此处只介绍proto ...

  3. Protocol Buffer学习教程之开篇概述(一)

    1. Protocol Buffer是什么 Protocol Buffer是google旗下的产品,用于序列化与反序列化数据结构,但是比xml更小.更快.更简单,而且能跨语言.跨平台.你可以把你的数据 ...

  4. Protocol Buffer学习笔记

    Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...

  5. Protocol Buffers学习教程

    最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...

  6. C++学习笔记一 —— 两个类文件互相引用的处理情况

    先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B;  class B;  class B; ……;  class B {……};  这样子. 2. 一个 ...

  7. [原创翻译]Protocol Buffer Basics: C#

    Protocol Buffer 基础知识:c#    原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial   ...

  8. Protocol Buffer技术

    转载自http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html 该系列Blog的内容主体主要源自于Protocol Bu ...

  9. Protocol Buffer详解

    1.Protocol Buffer 概念 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 ...

随机推荐

  1. jQuery 防止相同的事件快速重复触发

    重复触发就是防止用户重复点击提交数据了,我们一般都是点击之后没反应会再次点击了,这个不但要从用户体验上来做好,还在要js或php程序脚本上做好,让用户知道点击是己提交服务器正在处理,下面我就整理从脚本 ...

  2. FlexPaper+SwfTools实现的在线文档功能

    最近一个项目需要实现一个在线浏览文档的功能.准备使用FlexPaper配合Pdf2Swf实现. 主要需求在于: ➔ 文档页数很多,少则几百页,多则上千页.    ➔ 相应的文档大小也在50MB以上. ...

  3. css属性学习

    CSS display 属性 display 属性规定元素应该生成的框的类型. none:此元素不会被显示. block:此元素将显示为块级元素,此元素前后会带有换行符. inline默认.此元素会被 ...

  4. linux下libphenom的测试代码

    使用说明:测试使用libphenom库的字符串追加函数,效率是strcat的60多倍.所以在进行大量的字符串累加的时候可以考虑使用libphenom库  依赖库: ck-.tar.gz cmake-. ...

  5. linux 下消息队列发送后没有信息

    在使用消息队列时,调用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  6. The Truth About GCHandles

    I've heard several people asking why GCHandle doesn't implement IDisposable, considering it wraps an ...

  7. Swoole HTTP 的应用

    目录 概述 代码 小结 扩展 概述 这是关于 Swoole 学习的第四篇文章:Swoole HTTP 的应用. 第三篇:Swoole WebSocket 的应用 第二篇:Swoole Task 的应用 ...

  8. 使用makefile编译多个文件(.c , .cpp , .h等)

    有时候我们要一次运行多个文件,这时候我们可以使用Makefile!!! ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执 ...

  9. The King’s Ups and Downs

    有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况. 化简为 n个人,求出可以形成波浪形状的方法数 #include <iostream> #include <cma ...

  10. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) - Analyzer, tokenizer(4)

    有些时候,我们需要自定义 fieldType.下面的例子就是自定义的 fieldType,<analyzer type="index"> 表示索引时怎么处理,<a ...