gRPC 是 Google 提供的一个 RPC 框架,用于在网络上实现多个应用程序之间的通信。gRPC的优点是支持多种语言,因此可以轻松使用C++应用程序与Go或Python应用程序进行通信。
尽管CSDN、知乎有很多讲解gRPC在C++环境安装的文章,其中最常见的是使用pip、golang、nasm、yasm、perl等等工具进行安装。但大部分并没有分享安装过程可能遇到的问题,而且往往会因为某个工具没有安装,导致CMake编译的时候遇到编译报错;pip在下载gRPC依赖库的过程也会遇到问题,最后只能自己对着配置文件一个一个在github下载;即便克服了上述问题,在CMake成功编译后,运行编译后VS2022的sln文件,也可能出现由于依赖库产生的各种编译错误。综上所述,基于pip、golang、nasm、yasm、perl等等工具进行gRPC安装对新手是极度不友好的。
本文采用另外一种方式,利用vspkg包管理器去配置gRPC和protobuf库,鉴于vcpkg本身的安装极为简单,会为gRPC的安装带来便利。本文使用的主要工具为vcpkg包管理器,CMake编译器,VS2022编译环境。
下面提供一些可参考的文章,本文的思想源于知乎这篇文章,当然文章有一些可能遇到的问题,本文已规避。
知乎文章:在windows上使用C++ gRPC
OD’ed:Working with gRPC/C++ in Windows
vcpkg包管理器可以为我们自动安装C++源代码的项目;此外,包管理器可以解决库之间的兼容问题,这是个人很难处理的。我们将使用微软的跨平台开源包管理器,该包管理器的安装步骤非常简单,基本不会遇到障碍。
vspkg安装链接:https://github.com/Microsoft/vcpkg
在网站下载vcpkg后,还需要一步编译操作,生成vcpkg.exe文件。命令行转到vcpkg安装目录,并执行以下命令:
.\vcpkg\bootstrap-vcpkg.bat
安装后,必须将vcpkg的可执行文件的路径添加到环境变量的PATH变量中,例如,如下所示:
安装gRPC
使用vcpkg 安装 gRPC,在Windows启动控制台并执行以下命令:
vcpkg install grpc:x64-windows
如果没有添加环境变量,也可以考虑先转到vcpkg安装目录:
cd D:\vcpkg
安装protobuf
使用vcpkg 安装 protobuf,在Windows启动控制台并执行以下命令:
vcpkg install protobuf protobuf:x64-windows
可能存在的问题:
安装过程可能由于域名或者服务器问题,导致传输超时,如果情况允许,可以考虑,以方便vcpkg自动安装gRPC与protobuf的顺便完成。
对于 C++语言,编译器会根据定义的.proto 文件编译生成一个.h 头文件和一个.cc 源码实现文件。首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言的数据定义。以 gRPC 的github仓库的helloword.proto为例,proto文件定义如下。
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
为方便编译,我们建立三个文件夹和一个CMakeLists.txt文件,如下图所示:
将protoc.exe的路径加到环境变量,对应路径为D:\vcpkg\packages\protobuf_x64-windows\tools\protobuf。
github上下载helloworld.proto并放入proto文件路径,在Windows启动控制台并执行以下命令:
cd D:\vcpkg\grpc_example\proto
protoc --proto_path=. --cpp_out=. helloworld.proto
protoc --proto_path=. --grpc_out=. --plugin=protoc-gen-grpc="D:\vcpkg\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" helloworld.proto
可能要修改的地方:
cd D:\vcpkg\grpc_example\proto修改到自己对应的proto路径;
helloworld.proto修改为相应的proto文件名称;
grpc_cpp_plugin.exe需要确认一下,在目前文件是否能找到。
运行生成相应的接口和服务的.h和.cc文件,运行后的结果如下所示:
安装CMake
CMake下载地址:https://cmake.org/download/ ;下载安装后加入环境变量。
现在我们已经从 proto 文件生成了所需的文件,让我们添加服务器、客户端代码并创建一个项目。
在github上下载server.cc和client.cc文件,并且放入上文的src文件夹路径。
注意事项: 网上下载的server和client文件都存在路径问题,建议修改为相对路径。
#include "../proto/helloworld.grpc.pb.h"
编写CMakeLists.txt:
cmake_minimum_required( VERSION 3.1 )
project( grpc_example )
find_package(gRPC CONFIG REQUIRED)
find_package( Protobuf REQUIRED )
add_executable( server src/server.cpp proto/helloworld.grpc.pb.cc proto/helloworld.pb.cc)
add_executable( client src/client.cpp proto/helloworld.grpc.pb.cc proto/helloworld.pb.cc)
target_link_libraries( server PRIVATE gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite )
target_link_libraries( client PRIVATE gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite )
生成Visual Studio解决方案并编译:
转入build文件夹路径,在Windows启动控制台并执行以下命令:
cd D:\vcpkg\grpc_example\build
cmake -G "Visual Studio 17 2022" ../ -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake
注意事项:
注意自己对应的Visual Studio的版本号;
注意在目标路径能否找到vcpkg.cmake文件。
创建好项目之后,我们在build路径下进行编译:
cmake --build .
在Debug文件夹下,找到client.exe与server.exe两个可执行文件。
在两个不同的PowerShell下,输入如下命令:
打开server进程
cd D:\vcpkg\grpc_example\build\Debug
./server
打开client进程
cd D:\vcpkg\grpc_example\build\Debug
./client