在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

運行結果,生成了各種語言的協議文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM