google开源框架gRPC学习笔记(三)生成helloworld程序 - Go语言中文社区

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


一、定义proto

见:grpcexamplesprotoshelloworld.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拷到grpcexamplescpphelloworld文件夹,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的安装路径:我的在grpcbinthird_partyprotobufcmake和C:Program Files (x86)grpccmake,修改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(examplescpphelloworld里)拷到项目里并添加,

a.添加头文件

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

XXXXgrpcinclude;
XXXXgrpcthird_partyprotobufsrc;

b.设置库目录

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

XXXXgrpcbinthird_partycarescareslibDebug
XXXXgrpcbinthird_partyopenssl_64libReleaselib
XXXXgrpcbinthird_partyzlibDebug
XXXXgrpcbinDebug
XXXXgrpcbinthird_partyprotobufDebug
%(AdditionalLibraryDirectories)

其中openssl库用到(libeay32.lib; ssleay32.lib;):https://download.csdn.net/download/ncs12/10250609下载后放到binthird_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 (grpcbinthird_partyprotobufDebug)

           grpc.lib/gpr.lib/address_sorting.lib/grpc++     (grpcbinDebug)

           Ws2_32.lib直接加进来

           cares.lib(grpcbinthird_partycarescareslibDebug)

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

           zlibd.lib重命名为zlib.lib   (grpcbinthird_partyzlibDebug)

编译项目:

错误排查:

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里分别运行服务器与客户端就可以啦!(欢迎分享交流)

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qc530167365/article/details/89400942
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 21:58:40
  • 阅读 ( 2061 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢