在Windows10上搭建gRPC开发环境时,很多开发者习惯直接下载预编译好的protoc和grpc_cpp_plugin工具。但实际开发中,这种方式经常会遇到版本不匹配、功能缺失等问题。我曾在多个微服务项目中遇到protoc版本与grpc插件不兼容的情况,导致proto文件无法正确生成代码。
从源码构建工具链的最大优势在于:
以我最近参与的跨平台项目为例,团队需要同时支持C++和Python的gRPC服务。直接使用apt-get安装的protoc工具生成的Python代码无法与手动编译的C++服务互通,最终我们通过统一源码编译解决了兼容性问题。
gRPC的Windows编译强烈依赖MSVC工具链。我推荐使用VS2019而非更新的版本,因为它在兼容性和稳定性上表现最好。安装时需要注意:
安装完成后,建议运行以下命令验证环境:
bash复制cl.exe /?
如果提示找不到命令,需要从开始菜单启动"x64 Native Tools Command Prompt for VS 2019"。
除了VS2019,还需要准备以下工具(建议全部通过Chocolatey安装):
bash复制choco install -y git cmake ninja nasm
这些工具的作用分别是:
安装后检查各工具版本:
bash复制git --version
cmake --version
ninja --version
nasm -v
我建议选择稳定的LTS版本(如1.42.x系列),避免使用master分支。执行以下命令:
bash复制git clone -b v1.42.0 --recurse-submodules https://github.com/grpc/grpc
cd grpc
git submodule update --init --recursive
如果遇到网络问题,可以尝试修改.gitmodules中的URL为国内镜像源。我曾经花费数小时排查子模块下载失败的问题,最终发现是某些依赖的GitHub仓库访问不稳定。
gRPC依赖多个第三方库,最容易出问题的是protobuf和boringssl。手动处理方法:
bash复制cd third_party/abseil-cpp
git checkout LTS_20211102
特别需要注意zlib的版本兼容问题。编辑third_party/zlib/CMakeLists.txt,将第一行改为:
cmake复制cmake_minimum_required(VERSION 2.8...3.22)
在gRPC根目录创建build文件夹并配置CMake:
bash复制mkdir build && cd build
cmake .. -G "Visual Studio 16 2019" -A x64 ^
-DCMAKE_BUILD_TYPE=Release ^
-DgRPC_INSTALL=ON ^
-DgRPC_BUILD_TESTS=OFF ^
-DgRPC_PROTOBUF_PROVIDER=package ^
-Dprotobuf_WITH_ZLIB=ON
关键参数说明:
-A x64:强制64位构建-DgRPC_BUILD_TESTS=OFF:跳过测试节省时间-Dprotobuf_WITH_ZLIB=ON:启用zlib支持使用Ninja加速编译(比MSBuild快3倍以上):
bash复制cmake --build . --config Release --target grpc_cpp_plugin protoc
编译过程可能持续20-40分钟,取决于机器性能。我曾在一台i7笔记本上遇到内存不足的问题,解决方案是:
-DCMAKE_JOB_POOL_COMPILE:STRING=compile -DCMAKE_JOB_POOL_LINK:STRING=link -DCMAKE_JOB_POOLS:STRING=compile=2;link=1编译完成后,在build目录下查找:
grpc_cpp_plugin.exe:通常在Release子目录protoc.exe:在third_party/protobuf/Release验证工具是否可用:
bash复制./Release/grpc_cpp_plugin --version
./third_party/protobuf/Release/protoc --version
将编译产物组织成标准工具链结构:
bash复制mkdir D:\grpc_toolchain
copy .\Release\grpc_*.exe D:\grpc_toolchain\
copy .\third_party\protobuf\Release\protoc.exe D:\grpc_toolchain\
建议同时复制以下文件:
include/目录下的所有头文件lib/目录下的静态库文件third_party/protobuf/include/google下的protobuf头文件创建setenv.bat脚本方便使用:
bat复制@echo off
set GRPC_TOOLCHAIN=D:\grpc_toolchain
set PATH=%GRPC_TOOLCHAIN%;%PATH%
测试环境是否生效:
bash复制protoc --version
grpc_cpp_plugin --version
新建helloworld.proto:
protobuf复制syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
使用编译好的工具链生成代码:
bash复制protoc -I . --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc="grpc_cpp_plugin.exe" helloworld.proto
这会生成:
在你的项目中添加以下配置:
cmake复制find_package(gRPC CONFIG REQUIRED)
find_package(Protobuf REQUIRED)
add_executable(server server.cc helloworld.pb.cc helloworld.grpc.pb.cc)
target_link_libraries(server PRIVATE gRPC::grpc++ gRPC::grpc++_reflection)
错误1:缺少Windows SDK
code复制error MSB8036: The Windows SDK version 10.0.19041.0 was not found
解决方案:
bash复制cmake .. -DCMAKE_SYSTEM_VERSION=10.0.18362.0
错误2:zlib冲突
code复制fatal error C1083: Cannot open include file: 'zlib.h'
解决方案:
bash复制-DZLIB_ROOT=D:/grpc/third_party/zlib
bash复制choco install ccache
set CC="ccache cl"
set CXX="ccache cl"
bash复制cmake --build . --config Release --target protoc grpc_cpp_plugin
bash复制cmake --build . --config Release -- /m
如果需要修改gRPC核心行为,可以:
src/compiler/cpp_plugin.cc文件bash复制cmake --build . --config Release --target grpc_cpp_plugin
我曾经通过修改这个文件实现了:
将这套工具链与CI系统集成时,建议: