本文介绍在Windows下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境,以及开发、配置一个简单的c++服务端以及.net客户端。
0、前置条件
1、下载gRPC源码
使用git命令行在预备存放grpc源码的目录下执行, 此处我们下载的是 grpc 1.48.0
git clone -b v1.48.0 https://github.com/grpc/grpc
进入源码目录
cd grpc
下载依赖库
git submodule update --init
*此处注意,确保所有依赖库下载成功。
2、使用CMake生成工程文件
在生成工程文件时做,做如下调整:
l 添加ABSL_PROPAGATE_CXX_STD选项,类型为bool设置为true;
l 将源码目录下third_party\zlib\CMakeList.txt的第一行依赖的CMake版本修改为2.8.12;
l 添加CMAKE_INSTALL_PREFIX选项,类型为Path,设置为gRPC编译后的安装目录。
如下图所示:
点击【Configure】设置需要的编译环境,如下图所示:
点击【Finish】后配置环境日志中没有报错后,点击【Generate】生成工程文件。
3、编译、安装gRPC
使用管理员运行Visual Studio 2017,并打开上一步生成的工程grpc.sln。
将环境设置为Release x64生成ALL_BUILD项目。
生成INSTALL项目,此时会将生成的文件安装到第2步中CMAKE_INSTALL_PREFIX配置的路径中。
将安装目录下的bin目录路径添加到环境变量Path中,如下图所示:
至此,gRPC的c++环境已经配置好。
4、创建测试工程
创建一个解决方案GRPCTest包含c++空项目CPPServer及.Net 控制台项目DotNetClient。
在解决方案目录下创建pb文件夹,拷贝gRPC源码目录下examples\protos\helloworld.proto文件到pb文件夹中。
此时,整个解决方案的目录结构如下:
5、编译proto文件
打开命令行终端进入pb文件夹,执行以下命令生成c++文件及c#文件。
其中:grpc_cpp_plugin.exe及grpc_csharp_plugin.exe所在路径替换为您安装的路径。
此时整个解决方案的目录结构如下:
6、生成CPPServer项目
拷贝grpc源码目录下examples\cpp\helloworld\greeter_server.cc到CPPServer目录下,并将文件helloworld.grpc.pb.h、helloworld.pb.h、greeter_server.cc、helloworld.grpc.pb.cc及helloworld.pb.cc添加到CPPServer工程中。
添加包含目录,如下图所示,路径为grpc的安装路径:
添加附加库目录,如下图所示,路径为grpc的安装路径:
添加附加依赖项:
absl_bad_optional_access.lib
absl_bad_variant_access.lib
absl_base.lib
absl_city.lib
absl_civil_time.lib
absl_cord.lib
absl_cordz_functions.lib
absl_cordz_handle.lib
absl_cordz_info.lib
absl_cordz_sample_token.lib
absl_cord_internal.lib
absl_debugging_internal.lib
absl_demangle_internal.lib
absl_examine_stack.lib
absl_exponential_biased.lib
absl_failure_signal_handler.lib
absl_flags.lib
absl_flags_commandlineflag.lib
absl_flags_commandlineflag_internal.lib
absl_flags_config.lib
absl_flags_internal.lib
absl_flags_marshalling.lib
absl_flags_parse.lib
absl_flags_private_handle_accessor.lib
absl_flags_program_name.lib
absl_flags_reflection.lib
absl_flags_usage.lib
absl_flags_usage_internal.lib
absl_graphcycles_internal.lib
absl_hash.lib
absl_hashtablez_sampler.lib
absl_int128.lib
absl_leak_check.lib
absl_log_severity.lib
absl_low_level_hash.lib
absl_malloc_internal.lib
absl_periodic_sampler.lib
absl_random_distributions.lib
absl_random_internal_distribution_test_util.lib
absl_random_internal_platform.lib
absl_random_internal_pool_urbg.lib
absl_random_internal_randen.lib
absl_random_internal_randen_hwaes.lib
absl_random_internal_randen_hwaes_impl.lib
absl_random_internal_randen_slow.lib
absl_random_internal_seed_material.lib
absl_random_seed_gen_exception.lib
absl_random_seed_sequences.lib
absl_raw_hash_set.lib
absl_raw_logging_internal.lib
absl_scoped_set_env.lib
absl_spinlock_wait.lib
absl_stacktrace.lib
absl_status.lib
absl_statusor.lib
absl_strerror.lib
absl_strings.lib
absl_strings_internal.lib
absl_str_format_internal.lib
absl_symbolize.lib
absl_synchronization.lib
absl_throw_delegate.lib
absl_time.lib
absl_time_zone.lib
address_sorting.lib
cares.libcrypto.lib
gpr.libgrpc++.lib
grpc++_alts.lib
grpc++_error_details.lib
grpc++_reflection.lib
grpc++_unsecure.lib
grpc.lib
grpcpp_channelz.lib
grpc_plugin_support.lib
grpc_unsecure.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
re2.lib
ssl.lib
upb.lib
zlib.lib
编译生成CPPServer
7、生成DotNetClient
通过Nuget安装Grpc、Grpc.Core及Google.Protobuf
将Helloworld.cs及HelloworldGrpc.cs文件添加到项目中。
编辑Program.cs如下所示:
using System;
using Grpc.Core;
using Helloworld;
namespace DotNetClient
{
class Program
{
static void Main(string[] args)
{
Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
var reply = client.SayHello(new HelloRequest { Name = "tom" });
Console.WriteLine("Greeting: " + reply.Message);
channel.ShutdownAsync().Wait();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
编译生成DotNetClient
8、测试
先运行CPPServer.exe再运行DotNetClient.exe 如下图所示: