本文介绍在Windows10+ 下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境,以及开发、配置一个简单的c++服务端以及客户端。(过程令人头疼,参阅了大量博客,实际操作都存在问题,整理一下,希望对后来者有帮助)
1.前置条件
需要安装VS2017、Git、 CMake(测试使用的版本是3.26.0)、nasm非必须
官方文档:
https://github.com/grpc/grpc/blob/v1.48.0/BUILDING.md
2.下载源码
右键Git Bash here,然后使用如下命令:
git clone -b v1.48.0 https://github.com/grpc/grpc |
从git拉取代码,完成后,
cd grpc |
由于拉取下来的文件缺少一些第三方库文件,使用如下命令:
git submodule update --init --recursive |
出现 fail 也不要担心,会重复拉取,直至结束
3.使用CMake生成工程
在生成工程文件时:
- 添加ABSL_PROPAGATE_CXX_STD选项,类型为bool设置为true;
- 将源码目录下third_party\zlib\CMakeList.txt的第一行依赖的CMake版本修改为2.8.12;
- 添加CMAKE_INSTALL_PREFIX选项,类型为Path,设置为gRPC编译后的安装目录。
- 在grpc目录建立.build 文件夹,在grpc 同级目录建立grpcLibrary作为grpc
INSTALL 安装目录
点击Configure,出现Warning可以忽略;完成后Generate,使用管理员权限启动VS2017,在.build文件夹下打开 grpc.sIn。点击生成 -> 配置管理器:INSTALL 勾选,选择Release,x64
之后会生成所需静态库:如下文件夹
4.测试案例
(1)编译proto文件
从源码grpc\examples\protos中拷贝helloworld.proto 文件到 上文中的INSTALL 生成目录bin文件中。
打开cmd命令窗口,cd \d 到bin目录,输入以下两条命令:
protoc.exe --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe helloworld.proto
protoc.exe --cpp_out=. helloworld.prot
生成如下文件:
(2)建立GrpcClient 、GrpcService两个工程:
建立空项目,拷贝grpc源码目录下examples\cpp\helloworld\greeter_client.cc到GrpcClient 目录下,将文件helloworld.grpc.pb.h、helloworld.pb.h、helloworld.grpc.pb.cc及helloworld.pb.cc添加到GrpcClient 工程中。
建立空项目,拷贝grpc源码目录下examples\cpp\helloworld\greeter_server.cc到GrpcService目录下,将文件helloworld.grpc.pb.h、helloworld.pb.h、helloworld.grpc.pb.cc及helloworld.pb.cc添加到GrpcService工程中;
(3)配置VS环境
- 建立depend依赖包
- 创建文件夹depends, 子文件grpc 和 third_party
- 拷贝grpcLibrary 中include到新建文件夹grpc中;将源码文件夹下的third_party\protobuf\src拷贝到新建grpc中;将源码文件夹下的third_party\abseil-cpp拷贝到新建grpc中。
- 将grpcLibrary 中lib下文件拷贝到depend\third_party
- 配置VS
- 添加c++ 包含目录:
- 链接器库目录 附加依赖项
依赖项目录:(只有Release版本) absl_bad_any_cast_impl.lib 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.lib crypto.lib gpr.lib grpc++.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 zlibstatic.lib |
至此环境配置完成
(4)生成客户端、服务端
服务端:
客户端: