基于C++环境的gRPC安装配置:vcpkg+CMake+VS2022
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前言
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等工具一些工具的安装可以使用chocoWindows上的包管理工具来安装。
如果你用这种方式得保证你的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
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与protobuf
安装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
三、proto生成源文件
对于 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
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项目文件
五、Visual Studio编译项目
可以在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