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. 如何开发一个直播APP

    一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通 ...

  2. 使用BIND安装智能DNS服务器(一)---基本的主从DNS服务器搭建

    参考网址:http://www.unixmen.com/dns-server-installation-step-by-step-using-centos-6-3/ DNS(Domain Name S ...

  3. UVaLive 4727 Jump (递推)

    题意:约瑟夫环,求最后三个数. 析:f[i] = (f[i-1] + k) % i 这是求最后一个数时候,我们倒着推到第一个数时,只有一个数,所以当只有两个数时,就是另一数, 同理,我们可以求得第三个 ...

  4. Post 提交用户名和密码, 用户自动登录,无需手动登录

    public void AutoPost(string url,string domain, string userName) { AlipayProxy.UserReg.UserReg userRe ...

  5. ue4 svn备份目录

    http://blog.csdn.net/sh15285118586/article/details/55737480 UE4工程文件备份目录有:Config.Content.Plugins.Sour ...

  6. 51nod1105(二分)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 题意:中文题诶- 思路:直接二分答案,再通过二分找有多少 ...

  7. uoj#278. 【UTR #2】题目排列顺序(拓扑排序)

    传送门 对于每一个位置\(i\)来说,上一个和它的\(f_i\)相同的点一定比它大,我们从上一个\(f_i\)和它相同的点向它连边.第一个\(f_i-1\)出现的位置一定比它小,把它向那个位置连边. ...

  8. [Xcode 实际操作]六、媒体与动画-(3)使用CoreImage框架设置图片的单色效果

    目录:[Swift]Xcode实际操作 本文将演示如何使用图片框架,将图片转换成单色样式. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...

  9. Posture Energy——姿态的能量

    人的生活是套路化的,人活得越久,被套路化的概率就越大.普通百姓的生活都如同一个模板刻出来的. 一旦生活微调,我们会突然发现原来几十年的认知有问题,如同重获新生的感觉.譬如:早起,当我们每天早起一小时, ...

  10. [Android]进程间通信的方法

    一.管道 管道是进程间通信中最古老的方式,它包括 无名管道 和 有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信. 无名管道由pipe()函数创建. #i ...