在windows上一键编译各种版本的protobuf(2017-12-05修改)
所需工具 : 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.0 https://github.com/google/googlemock.git gmock rem 从github上拉取gtest cd gmock git clone -b release-1.7.0 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
运行结果,生成了各种语言的协议文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构