1、需求
因为项目需要,想要在windows+vs2017环境使用C++下编程gRPC并编写demo程序,使得能够根据proto文件生成对应的c++文件。
2、资料查阅
起初根据网络资料查阅,使用git从github中下载了gRPC最新的开源代码,并通过CMake编译,之后使用vs2017进行最终的编译生成,但在vs2017编译过程中,提示版本不匹配,需要vs2019及以上版本,本想进行vs的版本升级,但考虑到项目代码版本问题,最终选择低版本的gRPC进行编译与使用,再次查阅资料,最终,根据大佬的这篇文件
,完成了vs2017+gRPC1.48版本的编译。
3、编译工具
(1)Git;用于从github中将代码拉下
(2)CMake;编译gRPC
(3)Nasm;似乎是编译过程中openssl用到,不太了解,但网上搜索下载了一个
(4)VS2017 Professional;
4、编译步骤(就是把大佬的文章复制了一遍,为了防止大佬的文章链接失效)
(1)下载gRPC源码
使用git命令行在预备存放grpc源码的目录下执行, 此处我们下载的是 grpc 1.48.0
进入源码目录
下载依赖库
*此处注意,确保所有依赖库下载成功
(可以重复执行 git submodule update --init --recursive 命令,直到没有错误提示)。
(2)使用CMake生成工程文件
在生成工程文件时做,做如下调整:
l 添加ABSL_PROPAGATE_CXX_STD选项,类型为bool设置为true;
l 将源码目录下third_partyzlibCMakeList.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++环境已经配置好。
5、创建测试工程
大佬这里创建的C#项目,我的是C++项目,略有不同,此处略。
(1)编译proto文件
在protos文件夹的上级目录Project2中打开命令行终端,并输入两条指令,用于生成对应.proto文件的.grpc.pb.cc/.h以及.pb.cc/.h文件。
protoc -I="http://blog.csdn.net/weixin_44328139/article/details/protos" --grpc_out="http://blog.csdn.net/weixin_44328139/article/details/protos" --plugin=protoc-gen-grpc="D:ProjectGRPCProjectTestProjectProject2Project2Project2grpc_cpp_plugin.exe" "http://blog.csdn.net/weixin_44328139/article/details/protosroute_guide.proto"
protoc -I="http://blog.csdn.net/weixin_44328139/article/details/protos" --cpp_out="http://blog.csdn.net/weixin_44328139/article/details/protos" "http://blog.csdn.net/weixin_44328139/article/details/protos oute_guide.proto"
注意:其中:grpc_cpp_plugin.exe所在路径替换为您安装的路径。且proto路径根据自已的路径修改,如果不想修改,只需要根据我的路径存放proto文件即可。
(2)生成项目
将生成的.grpc.pb.cc/.h .pb.cc/.h以及proto文件添加到vs中,vs切换为Release x64版本(对应gRPC编译的版本,不知道Debug版本是否有问题,暂未尝试)。
注意:此处已有xxx_client.cc客户端文件与xxx_server.cc服务端文件,是从grpc源代码的范例中拷贝出来的,并稍做了修改,路径为“xxxgrpcexamplescpp oute_guide”
注意:需要查看生成的grpc.pb.h文件中是否包含中文注释,如果包含则需要删除中文注释,否则编译时将会出现
添加包含目录,如下图所示,路径为grpc的include安装路径:
添加附加库目录,如下图所示,路径为grpc的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
(3)运行项目
分别注释xxx_client.cc与xxx_server.cc文件中的main函数,并编辑,即可生成对应的client与server程序,先运行server程序,在运行client程序,进行通讯尝试,成功通讯。
6、感谢大佬分享
最后,再次感谢大佬的分享