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