Windows系统下GRPC在C++中的使用

1. 准备工作

按照grpc官网的指引先做环境配置,选好版本,不同版本要求下载的软件不一样,先选的1.15.1版本,但是安装 Active State Perl 总是安装失败,于是后边换了新一点的版本。先说1.15.1版本的安装历程,网址:https://github.com/grpc/grpc/blob/v1.15.1/BUILDING.md

(1) 安装vs2017

网址:https://my.visualstudio.com/Downloads?q=visual%20studio%202017&wt.mc_id=o~msft~vscom~older-downloads

社区版不能下载,下载的专业版

点击下载,然后安装,安装时选择与C++相关的项。

(2)安装Git

直接索引到上面的链接Git,下载安装即可。

(3)安装CMake

索引到链接Download CMake,我选择的是二进制分布中的windows x64版本。

(4)安装Active State Perl 

1)首先索引到网址Download & Install Perl - ActiveState安装,不能直接下载安装包,得注册账号,新建项目,然后安装指引进行安装

点击Install

有这样三个步骤,第一步下载使用state命令的工具安装,

第二步将命令行粘贴,在cmd中执行,但是会报错,不知如何解决。另外,执行这条命令成功的话会在C:\Users\Admin文件夹下创建MyFirstProject,失败会生成一个activestate.yaml的文件。

2)后边括号中的choco install activeperl 的意思是可以在安装软件安装工具包后使用命令行安装。

安装chocolatey软件安装包管理器,可以到官网下载Chocolatey Software | Installing Chocolatey,我使用的是命令行安装。

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

安装完毕,可以使用choco install activeperl命令了,但是会报错,换了电脑也没成功。

(5)安装Go

同样使用命令行choco install golang安装,此时会报一个错误

ERROR: The term 'Write-ChocolateyFailure' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. The install of yasm was NOT successful. Error while running 'C:\ProgramData\chocolatey\lib\yasm\tools\chocolateyInstall.ps1'. See log for details.

于是又安装了一个chocolatey的扩展包choco install chocolatey-compatibility.extension,然后安装Go成功了。

(6)安装yasm,使用命令行choco install yasm安装成功。

由于Perl安装失败,在编译源代码时会报缺少perl的错误,所以进行不下去了,猜测是由于1.15.1版本太老,是2018年的,环境依赖也不适用于现在的电脑系统或者与电脑中安装的某些环境冲突,所以换新一点的版本试试。

1.28.0版本,网址:https://github.com/grpc/grpc/blob/v1.28.0/BUILDING.md

前三步与1.15.1版本的安装一致,第四步使用命令行安装nasm,安装成功。

2. 克隆源代码

选好存放源代码的文件夹,右键选择Git bash here,将下列命令粘贴,然后Enter.

git clone --recurse-submodules -b v1.28.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc

"--recurse-submodules"会将third_party中的子模块也下载下来,但是1.15.1版本用同样的方法就只下载到third_party下的一层,再下一层文件夹就下载不到了,得自己手动下载。更新子模块也可用“git submodule update --init”。

3. 代码编译

(1)命令行编译

在grpc文件夹下,git分别执行以下命令

md .build //新建.build 文件夹(mkdir .build) 
cd .build //定位到.build下(pushd .build) 
cmake .. -G "Visual Studio 15 2017 Win64" //使用vs2017打开,会生成grpc.sln等工程(不知道算不算编译,算的话跟下一句的区别是什么)32位的话不需要写Win64 
cmake --build . --config Release //编译Release版本,如果不加Release则默认为Debug版本

(2)用vs编译

打开vs2017,选择打开文件夹,选择grpc文件夹,会自动编译。

4. 搭建C++ 示例工程

(1)VS2017中新建空的C++工程TestCPP;

(2)从grpc\examples\protos文件夹拷贝helloworld.proto到工程目录TestCPP下 ,从.build\third_party\protobuf\Release文件夹拷贝protoc.exe到工程目录下,从.build\Release拷贝grpc_cpp_plugin.exe到工程目录下,从grpc\examples\cpp\helloworld拷贝greeter_client.cc,greeter_server.cc到工程目录下;

(3)打开cmd,cd到工程目录TestCPP下,输入以下命令,Enter,生成helloworld.grpc.pb.cc、helloworld.grpc.pb.h;

protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe helloworld.proto

输入以下命令,生成helloworld.pb.cc、helloworld.pb.h;

protoc.exe -I=. --cpp_out=. helloworld.proto

(4)在解决方案资源管理器右键添加现有项,选择helloworld.pb.cc、helloworld.pb.h、helloworld.pb.cc、helloworld.pb.h,greeter_server.cc(greeter_client.cc不要同时添加,编译时会出错)。

(5)在vs工程中,菜单栏设置配置和平台,我设置的是Release、x64。注意一定要和选择的类库版本一致,Release和Debug不一致编译会报错。

在解决方案资源管理器右键TestCPP选择属性,

1)选择调试,设置环境PATH=E:\Others\GRPC28\grpc\.allbuild\third_party\zlib\Release 注:此处的.allbuild即上文中提到的.build,因为我重新编译在了.allbuild中;

2)选择C/C++ 常规,设置附加包含目录,E:\Others\GRPC28\grpc\include;E:\Others\GRPC28\grpc\third_party\protobuf\src

3)选择预处理器,配置预处理器定义_WIN32_WINNT=0x600

4)选择命令行,其他选项中填写-D_WIN32_WINNT=0x600

5)选择链接器常规,设置附加库目录,第三方库中编译出Release的都选择,手动去选,根据自己生成的文件夹设置,不要完全按我的拷贝,因为不同版本生成的文件会不一样;

E:\Others\GRPC28\grpc\.allbuild\third_party\protobuf\Release
E:\Others\GRPC28\grpc\.allbuild\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\zlib\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\cares\cares\lib\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\boringssl-with-bazel\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\boringssl-with-bazel\bssl.dir\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\boringssl-with-bazel\crypto.dir\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\base\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\container\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\flags\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\hash\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\numeric\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\random\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\strings\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\synchronization\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\time\Release
E:\Others\GRPC28\grpc\.allbuild\third_party\abseil-cpp\absl\types\Release

6)选择输入,设置附加依赖项,注意Debug版本和Release生成的不一样,比如zlib.lib,Debug生成的是zlibd.lib,所以按照自己的生成库填写。

grpc++_unsecure.lib
zlib.lib
ssl.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
WS2_32.Lib
cares.lib
upb.lib
grpcpp_channelz.lib
grpc_csharp_ext.lib
grpc++_reflection.lib
grpc++_error_details.lib
grpc_plugin_support.lib
grpc++_alts.lib
address_sorting.lib
grpc.lib
grpc++.lib
grpc_unsecure.lib
zlibstatic.lib
crypto.lib
gpr.lib
grpc_cronet.lib
absl_base.lib
absl_dynamic_annotations.lib
absl_exponential_biased.lib
absl_log_severity.lib
absl_malloc_internal.lib
absl_periodic_sampler.lib
absl_raw_logging_internal.lib
absl_scoped_set_env.lib
absl_spinlock_wait.lib
absl_throw_delegate.lib
absl_hashtablez_sampler.lib
absl_raw_hash_set.lib
absl_flags.lib
absl_flags_config.lib
absl_flags_internal.lib
absl_flags_marshalling.lib
absl_flags_program_name.lib
absl_flags_parse.lib
absl_flags_registry.lib
absl_flags_usage.lib
absl_flags_usage_internal.lib
absl_city.lib
absl_hash.lib
absl_int128.lib
absl_random_distributions.lib
absl_random_internal_distribution_test_util.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_str_format_internal.lib
absl_strings.lib
absl_strings_internal.lib
absl_graphcycles_internal.lib
absl_synchronization.lib
absl_civil_time.lib
absl_time.lib
absl_time_zone.lib
absl_bad_any_cast_impl.lib
absl_bad_optional_access.lib
absl_bad_variant_access.lib

(6)编译工程

右键TestCPP,生成,会在TestCPP\x64\Release文件夹中生成TestCPP.exe,将Release文件夹改名为ReleaseServer,将TestCPP.exe启动;

在资源管理器中选择greeter_server.cc右键移除,再添加greeter_client.cc,在main函数中添加std::cin.get();避免调试时启动窗口一闪而退,

编译,会在TestCPP\x64\Release文件夹中生成TestCPP.exe,启动或在vs中调试,出现下图中的消息表示通信成功。

编译时出现的错误:

LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”,因为我编译grpc源码时编译的是Release版本,生成的库是Release版本的,调试用的Debug模式,两者该统一。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用和提供了关于使用g++编译器编译gRPC的示例命令行。这些命令用于编译客户端和服务器端的源文件,并链接所需的库文件以及使用Protobuf和gRPC的相关选项。这些命令还包含了一些编译标志,用于指定编译选项和库文件的位置。 引用展示了一个生成的C代码的片段,其包含了一个IMLoginReq类。这个类定义了一些成员变量和成员函数,用于处理登录请求的消息。 总结起来,使用gRPC的C语言实现需要进行以下步骤: 1. 使用g++编译器编译客户端和服务器端的源文件,使用适当的编译选项和库文件。 2. 使用Protobuf和gRPC生成相关的代码文件,例如.h和.cc文件。 3. 在代码定义相应的类和函数来处理gRPC消息。 4. 编写客户端和服务器端的逻辑代码,实现相应的功能和交互。 5. 使用适当的命令行选项和库文件链接生成的可执行文件。 请注意,这只是一个概述,具体的实现步骤可能会因项目的具体需求和设置而有所不同。具体的实现细节和步骤应根据项目的要求和文档进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [gRPC应用C++](https://blog.csdn.net/weixin_40006133/article/details/111780229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++使用gRPC实例](https://blog.csdn.net/qq_42120843/article/details/128147013)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值