在Windows上一键编译各种版本的Protobuf
所需工具 : cmake for windows 和 git for windows
原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cmake来构建,所以我们可以把源码下载到本地,然后了利用cmake构建本地工程,然后编译.
本文以当前最新的 protobuf_3.5.0 为例
复制以下代码,保存到 one_key_download_and_build_protobuf.bat 文件中,运行即可.(windows上的bat最好都以gbk编码来编辑,避免出现中文乱码)
echo off & color 0A rem 参考文章 https://github.com/google/protobuf/blob/master/cmake/README.md
rem 默认当前操作系统已安装 git 和 cmake,并配置好了环境变量 set "WORK_DIR=%cd%"
echo %WORK_DIR% rem 设置所需要的Protobuf版本,最新版本可以在github上查到 https://github.com/google/protobuf
set "PROTOBUF_VESION=v3.5.0"
echo %PROTOBUF_VESION%
set "PROTOBUF_PATH=protobuf_%PROTOBUF_VESION%"
echo %PROTOBUF_PATH% rem 从githug上拉取protobuf源代码
git clone -b %PROTOBUF_VESION% https://github.com/google/protobuf.git %PROTOBUF_PATH% rem 从github上拉取gmock
cd %PROTOBUF_PATH%
git clone -b release-1.7. https://github.com/google/googlemock.git gmock rem 从github上拉取gtest
cd gmock
git clone -b release-1.7. https://github.com/google/googletest.git gtest cd %WORK_DIR%
rem 设置VS工具集,相当于指定VS版本,取决于VS的安装路径
set VS_DEV_CMD="D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"
rem 设置工程文件夹名字,用来区分不同的VS版本
set "BUILD_PATH=protobuf_%PROTOBUF_VESION%_vs2015_sln"
echo %BUILD_PATH%
if not exist %BUILD_PATH% md %BUILD_PATH%
cd %BUILD_PATH%
rem 设置编译版本 Debug Or Release
set "MODE=Release"
echo %MODE%
if not exist %MODE% md %MODE%
cd %MODE%
echo %cd% set "CMAKELISTS_DIR=%WORK_DIR%\%PROTOBUF_PATH%\cmake"
echo %CMAKELISTS_DIR% rem 开始构建和编译
call %VS_DEV_CMD%
cmake %CMAKELISTS_DIR% -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%MODE%
call extract_includes.bat
nmake /f Makefile echo %cd%
echo %PROTOBUF_VESION%
echo %BUILD_PATH%
echo %MODE%
pause
当然,你也可以的通过修改上面的的脚本来编译你所需要的版本,具体的参数注释的很详细
具体的版本可以在github上查到 https://github.com/google/protobuf
编译过程大约十分钟左右,当进度达到100%的时候,说明编译完成
此时,所有的东西都已经生成,包括头文件 和 lib文件和protoc.exe
protoc.exe 在 protobuf_3.5.0 的版本中多种语言,包括 cc, cs, java, javanano, js, objective-c, php, python, ruby
例如有如下proto文件: protocol.proto
// 指定语法规则
syntax = "proto3"; message Book
{
string name = 1;
int32 pages = 2;
float price = 3;
} message Student
{
int32 age = 1;
string name = 2;
float score = 3;
repeated Book arrBook = 4;
}
有如下脚本: generate.bat (windows上的bat最好都以gbk编码来编辑,避免出现中文乱码)
color 0A && echo off rem protoc程序名
set "PROTOC_EXE=protoc.exe"
rem .proto文件名
set "PROTOCOL_FILE_NAME=protocol.proto" %PROTOC_EXE% --version set "WORK_DIR=%cd%"
rem cpp
set "CPP_OUT_PATH=%cd%\cpp"
if not exist %CPP_OUT_PATH% md %CPP_OUT_PATH%
rem cs
set "CS_OUT_PATH=%cd%\cs"
if not exist %CS_OUT_PATH% md %CS_OUT_PATH%
rem java
set "JAVA_OUT_PATH=%cd%\java"
if not exist %JAVA_OUT_PATH% md %JAVA_OUT_PATH%
rem java Nano
set "JAVANANO_OUT_PATH=%cd%\javanano"
if not exist %JAVANANO_OUT_PATH% md %JAVANANO_OUT_PATH%
rem js
set "JS_OUT_PATH=%cd%\js"
if not exist %JS_OUT_PATH% md %JS_OUT_PATH%
rem objc(Objective C)
set "OBJC_OUT_PATH=%cd%\objc"
if not exist %OBJC_OUT_PATH% md %OBJC_OUT_PATH%
rem php
set "PHP_OUT_PATH=%cd%\php"
if not exist %PHP_OUT_PATH% md %PHP_OUT_PATH%
rem python
set "PYTHON_OUT_PATH=%cd%\python"
if not exist %PYTHON_OUT_PATH% md %PYTHON_OUT_PATH%
rem ruby
set "RUBY_OUT_PATH=%cd%\ruby"
if not exist %RUBY_OUT_PATH% md %RUBY_OUT_PATH% echo.generate cpp
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --cpp_out="%CPP_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate cs
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --csharp_out="%CS_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate java
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --java_out="%JAVA_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate java nano
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --javanano_out="%JAVANANO_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate js
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --js_out="%JS_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate objective c
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --objc_out="%OBJC_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate php
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --php_out="%PHP_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate python
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --python_out="%PYTHON_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
echo.generate ruby
"%WORK_DIR%\%PROTOC_EXE%" --proto_path="%WORK_DIR%" --ruby_out="%RUBY_OUT_PATH%" "%WORK_DIR%\%PROTOCOL_FILE_NAME%"
pause
运行结果,生成了各种语言的协议文件
在Windows上一键编译各种版本的Protobuf的更多相关文章
- 在windows上一键编译各种版本的protobuf(2017-12-05修改)
所需工具 : cmake for windows 和 git for windows 原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cm ...
- netcdf源码在windows上的编译
作者:朱金灿 来源:http://blog.csdn.net/clever101 今天搞搞netcdf源码在windows上的编译,折腾了半天,算是搞成了,特地记录一下过程.我的目标是要生成netcd ...
- Windows上快速编译caffe CPU版本
windows上快速安装配置Caffe的 cpu_only环境. 一:安装环境: 1.windows10: 2.Visual Studio2013: 3.Caffe版本:http://github.c ...
- Windows上成功编译CoreCLR源代码
昨天得知微软在GitHub上发布CoreCLR的源代码之后,立马从GitHub上签出代码,并尝试在Windows Server 2012上进行编译. 参考CoreCLR的开发者指南(Developer ...
- QT库在Windows上的编译
1.从http://www.qtcentre.org/下载QT源代码,注意是源代码.我下载到的是QT4.5.1版,文件名为qt-win-opensource-src-4.5.1.zip: 2.解压,注 ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- Zlib 在windows上的编译
1.下载http://www.zlib.net 下载,最新版本1.2.8 2.解压后,实际已提供了在vc下编译的工程,目录为:zlib-1.2.8\contrib\vstudio. 其中的zlibst ...
- 在windows上自动备份SVN版本库及定时删除
下面的脚本是在windows SVN的备份策略,采用的是hotcopy的方法 方案一: 1.先创建一个fullBackup的脚本:fullBackup.bat echo off rem Subvers ...
随机推荐
- 模拟 2013年山东省赛 J Contest Print Server
题目传送门 /* 题意:每支队伍需求打印机打印n张纸,当打印纸数累计到s时,打印机崩溃,打印出当前打印的纸数,s更新为(s*x+y)%mod 累计数清空为0,重新累计 模拟简单题:关键看懂题意 注意: ...
- onclientclick和onclick区别
OnClientClick是客户端脚本,一般使用javascript,在客户端,也就是IE中运行,点击后马上执行OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端,也就是IIS ...
- Quest Central for DataBase 5.0.1,6.1 (软件+注册)
找寻了多天,终于找到了,记录下,以后重装用.输入所有组件的licenses后,提示要注册,我选择了Canada,Google了一个地方的PostCode和phone number,填写,注册成功! 软 ...
- 【BZOJ】1036: [ZJOI2008]树的统计Count(lct/树链剖分)
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 lct: (ps:为嘛我的那么慢T_T,不知道排到哪了..难道别人都是树剖吗...看来有必要学 ...
- 【BZOJ】1084: [SCOI2005]最大子矩阵(DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...
- JavaScript_解决safari浏览器window.open无法实现的问题
解决 safari window.open 无法实现的问题 先说下问题是什么吧: safari 中没办法在回调函数里面执行window.open, 原因是safari的安全机制将其阻挡了(具体的原因可 ...
- SOLR (全文检索)
SOLR (全文检索) http://sinykk.iteye.com/ 1. 什么是SOLR 官方网站 http://wiki.apache.org/solr http://wiki.apach ...
- juniper-cisco-HP上网设置
网络拓扑: 路由模式: 第一步.配置防火墙的接口地址 编辑外网接口: 配置内网口(原理同上)(interface mode:nat) 第二步.配置防火墙的路由 第三步.配置防火墙安全策略 Cisco交 ...
- hrbust oj 1526+2028 树状数组
冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换 这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1 ...
- C#winfrom控件命名规范
※用红字标记的部分表示有重复出现,括号内为替代表示方案 1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox ...