Protocol Buffer学习教程之编译器与类文件(三)
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学习教程之编译器与类文件(三)的更多相关文章
- Protocol Buffer学习教程之类库应用(四)
Protocol Buffer学习教程之类库应用(四) 此教程是通过一个简单的示例,给C++开发者介绍一下如何使用protocol buffers编程,主要包括以下几部分: 定义一个.proto文件 ...
- Protocol Buffer学习教程之语法手册(二)
1.说明 此向导介绍如何使用protocol buffer language创建一个自己的protocolbuffer文件,包括语法与如何通过“.proto”文件生成数据访问的类,此处只介绍proto ...
- Protocol Buffer学习教程之开篇概述(一)
1. Protocol Buffer是什么 Protocol Buffer是google旗下的产品,用于序列化与反序列化数据结构,但是比xml更小.更快.更简单,而且能跨语言.跨平台.你可以把你的数据 ...
- Protocol Buffer学习笔记
Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...
- Protocol Buffers学习教程
最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...
- C++学习笔记一 —— 两个类文件互相引用的处理情况
先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B; class B; class B; ……; class B {……}; 这样子. 2. 一个 ...
- [原创翻译]Protocol Buffer Basics: C#
Protocol Buffer 基础知识:c# 原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial ...
- Protocol Buffer技术
转载自http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html 该系列Blog的内容主体主要源自于Protocol Bu ...
- Protocol Buffer详解
1.Protocol Buffer 概念 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 ...
随机推荐
- 【252】◀▶IEW-Unit17
Unit 17 Social Issues: Population 复杂表格写作技巧 1.Model1对应图片分析 The table contains information about the d ...
- 要把target下面虚拟路径的项目文件…
源码进不去,要检查target下面的项目文件,要删除掉. 版权声明:本文为博主原创文章,未经博主允许不得转载.
- codeblocks 汉字乱码
网上有很多方法,不过目测是不同的机子和环境要用不同的设置来应对这种情况 电脑情况: win8 64-bit 装的是codeblocks v12.11 然后在我电脑上正确的配置是setting-edit ...
- Invalidate()这个函数有什么用?
c++中的这个函数,一会是刷新窗口的作用,一会是使区域无效.我搞不懂这个函数究竟是有什么作用?谢谢赐教. void Invalidate( BOOL bErase = TRUE ); 该函数的作用是使 ...
- clone分支,修改文件本地commit后, push回原分支失败,处理方法
从远程clone 一个仓库到本地仓库A后,由于有多个分支,经常需要切换,不同分支区别比较大,切换一下,需要重编译,于是又在本地clone了改动较大的一个分支F到仓库B: 在B仓库改动后,提交到A仓库的 ...
- Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)【A,B,C】
翻车!翻车! codeforces782A A题: 水. 代码: #include <bits/stdc++.h> using namespace std; typedef long lo ...
- ue4 retarge记录
动画重定位(相同骨骼) https://docs.unrealengine.com/latest/CHN/Engine/Animation/AnimationRetargeting/index.htm ...
- 2017-9-20 NOIP模拟赛
A 约数之和 (count.pas/c/cpp)TL:1S ML:128MB[Description]我们用 D(x)表示正整数 x 的约数的个数.给定一个正整数 N,求 D(1)+D(2)+…+D( ...
- Openjudge2729 Blah数集(单调队列)
2729:Blah数集 总时间限制: 3000ms 内存限制: 65536kB 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下:(1) a是集合Ba ...
- webpack 打包和手动创建一个vue的项目
首先我们为啥要用webpack,为啥不用其他的打包的工具. 先听我捋捋, Webpack有人也称之为 模块打包机 ,由此也可以看出Webpack更侧重于模块打包,当然我们可以把开发中的所有资源(图片. ...