所需工具 : 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
運行結果,生成了各種語言的協議文件