zoukankan      html  css  js  c++  java
  • 在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.0Common7ToolsVsDevCmd.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%
    uby"
    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

    运行结果,生成了各种语言的协议文件

  • 相关阅读:
    hdu1010
    hiho1041
    cg基础
    python下载网页转化成pdf
    QT笔记 -- (6) opengl
    QT笔记 -- (5) 实现QWidget的paintEvent函数,在widget上画背景图形
    程序媛成长之路--厚积薄发
    mysql集群搭建教程-基础篇
    JAVA遇见HTML——tomcat篇
    【DRP】——JSP+servlet
  • 原文地址:https://www.cnblogs.com/tangxin-blog/p/5698137.html
Copyright © 2011-2022 走看看