基于C++环境的gRPC安装配置:vcpkg+CMake+VS2022

前言

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安装对新手是极度不友好的。

两种方式:

  1. 单独下载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 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 install

grpc quickstart

grpc Basics tutorial

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

使用vcpkg 引入包及grpc的使用

Windows系统下编译grpc源码+VS2019配置使用grpc

Windows+VS2017使用gRPC

windows系统c++/VS2019编译gRPC

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值