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格式引入,尽管所有文件都在同一目录下也一