Windows下编译Google protobuf

准备工作

Protobuf依赖CMakeGitAbseilzlib(可选)。前两者都是常用的工具,略过,这里详述后两者。

Abseil
  1. 官方Github的Release页面下载最新版源码包。
  2. 解压到适当位置,比如E:\protobuf\abseil
  3. 打开CMD并进入该目录
    1
    > cd E:\protobuf\abseil
  4. 创建编译工作目录并进入
    1
    > mkdir build && cd build
  5. 创建CMake配置
    1
    > cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -B . -DCMAKE_INSTALL_PREFIX=./output_release -DCMAKE_CXX_STANDARD=17 ..
    其中
    • -G "Visual Studio 17 2022"用于指定项目文件的生成器。生成器负责为您选择的构建系统生成构建配置文件。可选有(但不限于)Unix MakefilesNMake MakefilesVisual Studio x yyyyXcode等。
    • -A x64表示编译64位,32位设为Win32
    • -DCMAKE_BUILD_TYPE=Release表示编译Release版本,Debug版本就改为Debug(这个似乎要放到靠前位置,否则会有警告表示并没有被用到)
    • -B .设置工作目录
    • -DCMAKE_INSTALL_PREFIX=./output_release是最终安装的位置
    • -DCMAKE_CXX_STANDARD=17表面使用C++17标准
    • ..为源代码根目录(根CMakeList.txt所在目录)
  6. 编译安装
    1
    > cmake --build . --target install --config release -j 12
    其中
    • --build .即为前一步的工作目录
    • --target install指示CMake将项目的工件(例如,可执行文件、库、头文件)安装到配置项目时指定的安装前缀目录(-DCMAKE_INSTALL_PREFIX指定的目录)
    • --config release表面编译Release版本
    • -j 12表示用12线程并行编译

完成后可以在配置时候指定的./output_release找到头文件和编译的库文件。

zlib
  1. 官网下载最新版源码包。
  2. 解压到适当位置,并进入该目录
  3. 创建CMake配置
    1
    > cmake -G "Visual Studio 17 2022" -A x64 -B . -DCMAKE_INSTALL_PREFIX=./output_release -DCMAKE_CXX_STANDARD=17 ..
    其中
    • -G "Visual Studio 17 2022"用于指定项目文件的生成器。生成器负责为您选择的构建系统生成构建配置文件。可选有(但不限于)Unix MakefilesNMake MakefilesVisual Studio x yyyyXcode等。
    • -A x64表示编译64位,32位设为Win32
    • -B .设置工作目录
    • -DCMAKE_INSTALL_PREFIX=./output_release是最终安装的位置
    • -DCMAKE_CXX_STANDARD=17表面使用C++17标准
    • ..为源代码根目录(根CMakeList.txt所在目录)
  4. 编译安装
    1
    > cmake --build . --target install --config release -j 12
    其中
    • --build .即为前一步的工作目录
    • --target install指示CMake将项目的工件(例如,可执行文件、库、头文件)安装到配置项目时指定的安装前缀目录(-DCMAKE_INSTALL_PREFIX指定的目录)
    • --config release表面编译Release版本
    • -j 12表示用12线程并行编译

编译安装

  1. 官方Github的Release页面下载最新版源码包。

  2. 解压到适当位置,比如E:\protobuf\protobuf

  3. 切换到该目录

  4. 创建CMake配置

    1
    > cmake -S . -B cmake-out -DCMAKE_INSTALL_PREFIX=./output -DCMAKE_CXX_STANDARD=17 -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -Dprotobuf_ABSL_PROVIDER=package -Dprotobuf_MSVC_STATIC_RUNTIME=OFF -DCMAKE_PREFIX_PATH=E:\protobuf\abseil\build\output_release -DZLIB_ROOT=E:\protobuf\zlib\build\output_release

    其中:

    • -S ."指定源码解压的位置(根CMakeList.txt所在目录),这里是当前文件夹
    • -B cmake-out设置工作目录
    • -DCMAKE_INSTALL_PREFIX=./output是最终安装的位置
    • -DCMAKE_CXX_STANDARD=17表面使用C++17标准
    • -Dprotobuf_BUILD_TESTS=OFF关掉GTest
    • -Dprotobuf_ABSL_PROVIDER=package指定protobuf如何链接Abseil,module是Abseil已经包含了Abseil,不需要格外提供Abseil在库目录里面;package表示需要提供Abseil在库目录里面
    • -Dprotobuf_MSVC_STATIC_RUNTIME=OFF表示动态链接C++ runtime library (CRT),设为ON则是静态链接。因为Abseil官方只提供了动态链接方式(不改CMakeList.txt的情况下),所以这里也只能用OFF,否则报链接错误
    • -DCMAKE_PREFIX_PATH=..\abseil\build\output_release准备工作中Abseil的安装目录
    • -DZLIB_ROOT=E:\protobuf\zlib\build\output_release准备工作中zlib的安装目录
  5. 编译安装

    1
    cmake --build cmake-out --config Release --target install

    这个选项含义同上面Abseil