google开源框架gRPC学习笔记(三)生成helloworld程序

4 篇文章 0 订阅

一、定义proto

见:grpc\examples\protos\helloworld.proto

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;
}

二、生成访问代码

接下来我们需要从 .proto 的服务定义中生成 gRPC 客户端和服务器端的接口。我们通过 protocol buffer 的编译器 protoc 以及一个特殊的 gRPC C++ 插件来完成。

方法:

   1、将helloworld.proto与上一小节生成的grpc_cpp_plugin.exe、protoc.exe拷贝到一个文件夹中

   2、cd 到该文件夹

   3、依次执行以下两条:

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

    生成以下四个文件:

hellowworld.pb.h 声明生成的消息类的头文件
hellowworld.pb.cc  包含消息类的实现
hellowworld.grpc.pb.h 声明你生成的服务类的头文件
hellowworld.grpc.pb.cc 包含服务类的实现

三、创建服务器

有两种+方法生成服务器以及客户端程序:

 1、源码提供的CMakeLists.txt(熟悉VS的可直接跳到2):

     将生成的4个文件及helloworld.proto拷到grpc\examples\cpp\helloworld文件夹,cmake生成

遇到Could not find a package configuration file provided by "Protobuf"问题:找不到ProtobufConfig.cmake

见stackoverflow问题:https://stackoverflow.com/questions/41573702/cant-use-protobuf-in-cmakelists-txt?answertab=oldest#

解决办法:找到protobuf-config.cmake的安装路径:我的在grpc\bin\third_party\protobuf\cmake和C:\Program Files (x86)\grpc\cmake,修改Protobuf_DIR为

接着碰到找不到gRPCTargets.cmake问题:

见:stackoverflow:  https://stackoverflow.com/questions/43349916/grpc-cmake-installation-doesnt-generate-targets-file

       github:https://github.com/grpc/grpc/issues/10759或者更改grpc依赖

找了半天没解决。希望看到的大佬帮我解决一下,万分感谢,CmakeFiles.txt问题行:

  # Find Protobuf installation
  # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.
  set(protobuf_MODULE_COMPATIBLE TRUE)
  find_package(Protobuf CONFIG REQUIRED)
  message(STATUS "Using protobuf ${protobuf_VERSION}")

  set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
  set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)

  # Find gRPC installation
  # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
  find_package(gRPC CONFIG REQUIRED)
  message(STATUS "Using gRPC ${gRPC_VERSION}")

综合看来官方提供的CmakeFiles.txt这条路走不通,那我只能拿出VS了。。。

------------------------------分割线--------------------------------

2、用VS生成服务器以及客户端程序

创建helloworld解决方案,解决方案名和项目名分别如下:

(1)先写server:(创建C++空项目即可)

将之前第二步生成的4个文件及helloworld.proto和greeter_client.cc(examples\cpp\helloworld里)拷到项目里并添加,

a.添加头文件

右键hw_server项目,属性——C/C++——常规——附加包含目录,添加

XXXX\grpc\include;
XXXX\grpc\third_party\protobuf\src;

b.设置库目录

右键hw_server项目,属性——链接器——常规——附加库目录,添加

XXXX\grpc\bin\third_party\cares\cares\lib\Debug
XXXX\grpc\bin\third_party\openssl_64libRelease\lib
XXXX\grpc\bin\third_party\zlib\Debug
XXXX\grpc\bin\Debug
XXXX\grpc\bin\third_party\protobuf\Debug
%(AdditionalLibraryDirectories)

其中openssl库用到(libeay32.lib; ssleay32.lib;):https://download.csdn.net/download/ncs12/10250609下载后放到bin\third_party目录下。

c.添加库

右键hw_server项目,属性——链接器——输入——附加依赖项,添加

libprotobuf.lib
grpc.lib
gpr.lib
Ws2_32.lib
address_sorting.lib
cares.lib
grpc++.lib
libeay32.lib
ssleay32.lib
zlibstatic.lib

注意:libprotobufd.lib 重命名为libprotobuf.lib (grpc\bin\third_party\protobuf\Debug)

           grpc.lib/gpr.lib/address_sorting.lib/grpc++     (grpc\bin\Debug)

           Ws2_32.lib直接加进来

           cares.lib(grpc\bin\third_party\cares\cares\lib\Debug)

           libeay32.lib; ssleay32.lib;              见上b.

           zlibd.lib重命名为zlib.lib   (grpc\bin\third_party\zlib\Debug)

编译项目:

错误排查:

a.      error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突...

解决:编译器改为与模块一致,例如我的

b.      C1189: #error : "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"

解决:项目属性——C/C++——预处理器——预处理器定义:添加     _WIN32_WINNT=0x600

c.    LNK2019    无法解析的外部符号 address_sorting_init,该符号在函数 "void __cdecl grpc_resolver_dns_ares_init(void)" (?grpc_resolver_dns_ares_init@@YAXXZ) 中被引用  ....

解决:添加 address_sorting.lib

d.无法解析的外部符号,都是缺少静态库.lib文件,需要根据相应去排查

最后,服务器程序终于生成成功

 

(2)客户端同理,重新建一个项目

 

生成后在Debug里分别运行服务器与客户端就可以啦!(欢迎分享交流)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值