赞
踩
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安装对新手是极度不友好的。
两种方式:
单独下载grpc源码,下载第三方库
gRPC官方Windows安装说明:
Windows
To prepare for cmake + Microsoft Visual C++ compiler build
Install Visual Studio 2017 or later (Visual C++ compiler will be used).
Install Git.
Install CMake.
Install nasm and add it to PATH (choco install nasm) - required by boringssl
(Optional) Install Ninja (choco install ninja)
在Windows上源码编译安装gRPC还是很麻烦的需要MSVC编译器、git、cmake、Perl、go、yasm、Ninja等工具,一些工具的安装可以使用choco(Windows上的包管理工具)来安装。
如果你用这种方式得保证你的cmake版本要新,尽量要在3.13版本之上,我这里下载的是最新的版本:
编译结果:总是报错,缺少absl的相关库,即使包含了absl相关库路径和库名称仍然报错;
这里给出官方的安装说明:
gRPC C++ - Building from source
2本文采用另外一种方式,利用vspkg包管理器去配置gRPC和protobuf库,鉴于vcpkg本身的安装极为简单,会为gRPC的安装带来便利。本文使用的主要工具为vcpkg包管理器,CMake编译器,VS2022编译环境。
本文是参考这篇文章进行编译的:https://blog.csdn.net/weixin_44229257/article/details/124104808
vcpkg包管理器可以为我们自动安装C++源代码的项目;此外,包管理器可以解决库之间的兼容问题,这是个人很难处理的。我们将使用微软的跨平台开源包管理器,该包管理器的安装步骤非常简单,基本不会遇到障碍。
vspkg安装链接:https://github.com/Microsoft/vcpkg
git clone https://github.com/Microsoft/vcpkg.git
在网站下载vcpkg后,还需要一步编译操作,生成vcpkg.exe文件。命令行转到vcpkg安装目录,并执行以下命令:
.\vcpkg\bootstrap-vcpkg.bat
执行后会在当前目录下生成vcpkg.exe文件
安装后,必须将vcpkg的可执行文件的路径添加到环境变量的PATH变量中,例如,如下所示:
安装gRPC
使用vcpkg 安装 gRPC,在Windows启动控制台并执行以下命令:
vcpkg install grpc:x64-windows
vcpkg install grpc:x64-windows
如果没有添加环境变量,也可以考虑先转到vcpkg安装目录:
cd E:\project\opensource\vcpkg
安装protobuf
使用vcpkg 安装 protobuf,在Windows启动控制台并执行以下命令:
vcpkg install protobuf protobuf:x64-windows
对于 C++语言,编译器会根据定义的.proto 文件编译生成一个.h 头文件和一个.cc 源码实现文件。首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言的数据定义。以 gRPC 的github仓库的helloword.proto为例,proto文件定义如下。
helloword.proto位置在:
E:\project\opensource\vcpkg\buildtrees\grpc\src\v1.51.1-1066d25324.clean\examples\protos\helloword.proto
helloword.proto内容
- // Copyright 2015 gRPC authors.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- 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的路径加到环境变量,对应路径为E:\project\opensource\vcpkg\packages\protobuf_x64-windows\tools\protobuf
github上下载helloworld.proto并放入proto文件路径,同时也将protoc.exe拷贝到当前项目目录proto的目录下,在Windows启动控制台并执行以下命令:
- cd E:\project\opensource\gprc_hello\grpc_hello\grpc_hello\proto
- protoc --proto_path=. --cpp_out=. helloworld.proto
- protoc --proto_path=. --grpc_out=. --plugin=protoc-gen-grpc="E:\project\opensource\vcpkg\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" helloworld.proto
可能要修改的地方:
cd E:\project\opensource\gprc_hello\grpc_hello\grpc_hello\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.cc proto/helloworld.grpc.pb.cc proto/helloworld.pb.cc)
- add_executable( client src/client.cc 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 )
注意:第5行,第6行的src/server.cc 和src/client.cc必须和你src/目录下的源文件名称对应起来,看准后缀是cpp格式还是cc格式,否则会报错
生成Visual Studio解决方案并编译:
转入build文件夹路径,在Windows启动控制台并执行以下命令:
cd E:\project\opensource\gprc_hello\grpc_hello\grpc_hello\build
cmake -G "Visual Studio 17 2022" ../ -DCMAKE_TOOLCHAIN_FILE="E:\project\opensource\vcpkg\scripts\buildsystems/vcpkg.cmake"
注意事项:
注意自己对应的Visual Studio的版本号;
注意在目标路径能否找到vcpkg.cmake文件。
结果:会在build当前目录生成grpc_example.sln项目文件
可以在client.cc 的main函数结尾加上: std::cin.get(); 以防止客户端快速退出;
第一种方式:创建好项目之后,我们在build路径下进行编译:
cmake --build
在Debug文件夹下,找到client.exe与server.exe两个可执行文件。
在两个不同的PowerShell下,输入如下命令:
- ./server
-
- ./client
第二种方式:用vs2022打开sln项目工程文件编译
编译成功后,运行server.exe:
保持server不关,然后再运行client.exe:
参考链接:
基于C++环境的gRPC安装配置:vcpkg+CMake+VS2022
Working with gRPC/C++ in Windows
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。