1 准备工作
1.1 参考链接
1.2 “*.proto”文件准备
1.2.1 源文件里的例子里
路径:“./grpc/examples/protos”

1.2.2 自己写
代码示例如下,保存文件后缀“.proto” @Protocol Buffers 文档
syntax = "proto3";
package hello;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
2 VC++项目使用
2.1 生成*.proto.pb.cc、*.proto.pb.h、*.pb.cc、*.pb.h文件
VS2022创建空白项目,将准备的“*.proto”文件copy值项目目录下,并在此目录下“cmd.exe”调出控制台输入以下命令:
D:\...\mscv2015\third_party\protobuf\Release\protoc.exe -I="." --grpc_out="." --plugin=protoc-gen-grpc="D:\...\mscv2015\Release\grpc_cpp_plugin.exe" "helloworld.proto"
D:\...\mscv2015\third_party\protobuf\Release\protoc.exe --cpp_out=. "helloworld.proto"
生成以下文件:

将生成的文件以及*.proto文件添加至项目工程,将grpc源码示例中的“greeter_server.cc”文件copy至工程目录,并添加至工程(生成服务端软件)。
2.2 配置项目(debug模式)
打开项目属性,如下图:

2.2.1 附件包含目录

2.2.2 预处理器定义
![]()
2.2.3 附加库目录

2.2.4 附加依赖项

完整附加依赖项目录如下:
libprotobufd.lib
gpr.lib
grpc.lib
grpc++.lib
grpc++_reflection.lib
address_sorting.lib
ws2_32.lib
cares.lib
zlibstaticd.lib
upb.lib
ssl.lib
crypto.lib
absl_bad_any_cast_impl.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_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_config.lib
absl_flags_internal.lib
absl_flags_marshalling.lib
absl_flags_parse.lib
absl_flags_program_name.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_leak_check_disable.lib
absl_log_severity.lib
absl_malloc_internal.lib
absl_periodic_sampler.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_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_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
absl_statusor.lib
re2.lib
2.2.5 编译运行结果

2.3 配置项目(Release模式)
2.3.1 附件包含目录
同debug模式。
2.3.2 预处理器定义
注意:这里有差别,下图红笔标注处

2.3.3 附加库目录
这里需要注意的是,debug需要替换成Release

2.3.4 附加依赖项
这里有两个lib需要注意,其他同debug模式:libprotobuf.lib;zlibstatic.lib;
2.3.5 编译运行结果

3 Qt项目使用
测试项目与VC++项目区别:
1、建Qt控制台项目,Qt Project Setting如下:

2、“greeter_server.cc”、“greeter_client.cc”文件与“main.cpp”合并,server示例代码如下:
#include <QtCore/QCoreApplication>
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#ifdef BAZEL_BUILD
#include "examples/protos/helloworld.grpc.pb.h"
#else
#include "hello.grpc.pb.h"
#endif
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using hello::HelloRequest;
using hello::HelloReply;
using hello::Greeter;
// Logic and data behind the server's behavior.
class GreeterServiceImpl final : public Greeter::Service {
Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
std::string prefix("Hello ");
reply->set_message(prefix + request->name());
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
GreeterServiceImpl service;
ServerBuilder builder;
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
server->Wait();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
RunServer();
return a.exec();
}
3 运行结果

696

被折叠的 条评论
为什么被折叠?



