vs2019编译grpc静态库

vs2019编译grpc静态库

1 获取代码

git clone --recurse-submodules https://github.com/grpc/grpc.git

2 编译

编译64位库:

1 cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../install/x64/debug
2 cmake --build . --config Debug --target install
3 
4 cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../install/x64/release
5 cmake --build . --config Release --target install

 编译32位库:

1 cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../install/x86/debug
2 cmake --build . --config Debug --target install
3 
4 cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../install/x86/release
5 cmake --build . --config Release --target install

 3 应用

3.1 visual studio 2022

visual studio 2022 新建x64 grpc服务器端和客户端两个工程。并在两个工程中分别引入grpc头文件和lib文件。编写hello.proto文件,内容如下:

复制代码
 1 syntax = "proto3";
 2 
 3 package example;
 4 
 5 // Greeter 服务定义
 6 service Greeter {
 7   // SayHello 方法,接收一个 HelloRequest 返回 HelloResponse
 8   rpc SayHello (HelloRequest) returns (HelloResponse);
 9 }
10 
11 // 请求消息类型
12 message HelloRequest {
13   string name = 1;  // 客户端请求的名字
14 }
15 
16 // 响应消息类型
17 message HelloResponse {
18   string message = 1;  // 服务端返回的问候信息
19 }
复制代码

使用如下命令编译hello.proto文件:

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

并将生成的4个文件分别放入grpc服务器端和客户端工程目录,并分别加载库文件。

加载库文件:

复制代码
#pragma comment(lib, "absl_bad_any_cast_impl.lib")
#pragma comment(lib, "absl_bad_optional_access.lib")
#pragma comment(lib, "absl_bad_variant_access.lib")
#pragma comment(lib, "absl_base.lib")
#pragma comment(lib, "absl_city.lib")
#pragma comment(lib, "absl_civil_time.lib")
#pragma comment(lib, "absl_cord.lib")
#pragma comment(lib, "absl_cord_internal.lib")
#pragma comment(lib, "absl_cordz_functions.lib")
#pragma comment(lib, "absl_cordz_handle.lib")
#pragma comment(lib, "absl_cordz_info.lib")
#pragma comment(lib, "absl_cordz_sample_token.lib")
#pragma comment(lib, "absl_crc_cord_state.lib")
#pragma comment(lib, "absl_crc_cpu_detect.lib")
#pragma comment(lib, "absl_crc_internal.lib")
#pragma comment(lib, "absl_crc32c.lib")
#pragma comment(lib, "absl_debugging_internal.lib")
#pragma comment(lib, "absl_demangle_internal.lib")
#pragma comment(lib, "absl_die_if_null.lib")
#pragma comment(lib, "absl_examine_stack.lib")
#pragma comment(lib, "absl_exponential_biased.lib")
#pragma comment(lib, "absl_failure_signal_handler.lib")
#pragma comment(lib, "absl_flags.lib")
#pragma comment(lib, "absl_flags_commandlineflag.lib")
#pragma comment(lib, "absl_flags_commandlineflag_internal.lib")
#pragma comment(lib, "absl_flags_config.lib")
#pragma comment(lib, "absl_flags_internal.lib")
#pragma comment(lib, "absl_flags_marshalling.lib")
#pragma comment(lib, "absl_flags_parse.lib")
#pragma comment(lib, "absl_flags_private_handle_accessor.lib")
#pragma comment(lib, "absl_flags_program_name.lib")
#pragma comment(lib, "absl_flags_reflection.lib")
#pragma comment(lib, "absl_flags_usage.lib")
#pragma comment(lib, "absl_flags_usage_internal.lib")
#pragma comment(lib, "absl_graphcycles_internal.lib")
#pragma comment(lib, "absl_hash.lib")
#pragma comment(lib, "absl_hashtablez_sampler.lib")
#pragma comment(lib, "absl_int128.lib")
#pragma comment(lib, "absl_kernel_timeout_internal.lib")
#pragma comment(lib, "absl_leak_check.lib")
#pragma comment(lib, "absl_log_entry.lib")
#pragma comment(lib, "absl_log_flags.lib")
#pragma comment(lib, "absl_log_globals.lib")
#pragma comment(lib, "absl_log_initialize.lib")
#pragma comment(lib, "absl_log_internal_check_op.lib")
#pragma comment(lib, "absl_log_internal_conditions.lib")
#pragma comment(lib, "absl_log_internal_format.lib")
#pragma comment(lib, "absl_log_internal_globals.lib")
#pragma comment(lib, "absl_log_internal_log_sink_set.lib")
#pragma comment(lib, "absl_log_internal_message.lib")
#pragma comment(lib, "absl_log_internal_nullguard.lib")
#pragma comment(lib, "absl_log_internal_proto.lib")
#pragma comment(lib, "absl_log_severity.lib")
#pragma comment(lib, "absl_log_sink.lib")
#pragma comment(lib, "absl_low_level_hash.lib")
#pragma comment(lib, "absl_malloc_internal.lib")
#pragma comment(lib, "absl_periodic_sampler.lib")
#pragma comment(lib, "absl_random_distributions.lib")
#pragma comment(lib, "absl_random_internal_distribution_test_util.lib")
#pragma comment(lib, "absl_random_internal_platform.lib")
#pragma comment(lib, "absl_random_internal_pool_urbg.lib")
#pragma comment(lib, "absl_random_internal_randen.lib")
#pragma comment(lib, "absl_random_internal_randen_hwaes.lib")
#pragma comment(lib, "absl_random_internal_randen_hwaes_impl.lib")
#pragma comment(lib, "absl_random_internal_randen_slow.lib")
#pragma comment(lib, "absl_random_internal_seed_material.lib")
#pragma comment(lib, "absl_random_seed_gen_exception.lib")
#pragma comment(lib, "absl_random_seed_sequences.lib")
#pragma comment(lib, "absl_raw_hash_set.lib")
#pragma comment(lib, "absl_raw_logging_internal.lib")
#pragma comment(lib, "absl_scoped_set_env.lib")
#pragma comment(lib, "absl_spinlock_wait.lib")
#pragma comment(lib, "absl_stacktrace.lib")
#pragma comment(lib, "absl_status.lib")
#pragma comment(lib, "absl_statusor.lib")
#pragma comment(lib, "absl_str_format_internal.lib")
#pragma comment(lib, "absl_strerror.lib")
#pragma comment(lib, "absl_string_view.lib")
#pragma comment(lib, "absl_strings.lib")
#pragma comment(lib, "absl_strings_internal.lib")
#pragma comment(lib, "absl_symbolize.lib")
#pragma comment(lib, "absl_synchronization.lib")
#pragma comment(lib, "absl_throw_delegate.lib")
#pragma comment(lib, "absl_time.lib")
#pragma comment(lib, "absl_time_zone.lib")
#pragma comment(lib, "utf8_range.lib")
#pragma comment(lib, "utf8_range_lib.lib")
#pragma comment(lib, "utf8_validity.lib")
#pragma comment(lib, "libprotobufd.lib")
#pragma comment(lib, "gpr.lib")
#pragma comment(lib, "grpc.lib")
#pragma comment(lib, "grpc_authorization_provider.lib")
#pragma comment(lib, "grpc_plugin_support.lib")
#pragma comment(lib, "grpc_unsecure.lib")
#pragma comment(lib, "grpc++.lib")
#pragma comment(lib, "grpc++_alts.lib")
#pragma comment(lib, "grpc++_error_details.lib")
#pragma comment(lib, "grpc++_reflection.lib")
#pragma comment(lib, "grpc++_unsecure.lib")
#pragma comment(lib, "grpcpp_channelz.lib")
#pragma comment(lib, "re2.lib")
#pragma comment(lib, "address_sorting.lib")
#pragma comment(lib, "upb.lib")
#pragma comment(lib, "upb_collections_lib.lib")
#pragma comment(lib, "upb_json_lib.lib")
#pragma comment(lib, "upb_textformat_lib.lib")
#pragma comment(lib, "cares.lib")
#pragma comment(lib, "ssl.lib")
#pragma comment(lib, "crypto.lib")
#pragma comment(lib, "zlib.lib")
复制代码

 服务器端实现代码:

复制代码
 1 #include <iostream>
 2 #include<algorithm>
 3 #include<chrono>
 4 #include<cstdint>
 5 #include<random>
 6 #include<vector>
 7 #include<omp.h>
 8 
 9 #include<stdio.h>
10 #include<stdlib.h>
11 #include <grpcpp/grpcpp.h>
12 #include "hello.grpc.pb.h"
13 
14 
15 class GreeterServiceImpl final : public example::Greeter::Service {
16 public:
17     grpc::Status SayHello(grpc::ServerContext* context, const example::HelloRequest* request,
18         example::HelloResponse* response) override {
19         std::string prefix = "Hello, ";
20         response->set_message(prefix + request->name());
21         return grpc::Status::OK;
22     }
23 };
24 
25 void RunServer() {
26     std::string server_address("0.0.0.0:50051");
27     GreeterServiceImpl service;
28 
29     grpc::ServerBuilder builder;
30     builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
31     builder.RegisterService(&service);
32 
33     std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
34     std::cout << "Server listening on " << server_address << std::endl;
35 
36     server->Wait();
37 }
38 
39 int main()
40 {
41     RunServer();
42     return 0;
43 }
复制代码

客户端代码:

复制代码
 1 #include <iostream>
 2 #include<algorithm>
 3 #include<chrono>
 4 #include<cstdint>
 5 #include<random>
 6 #include<vector>
 7 #include<omp.h>
 8 
 9 #include<stdio.h>
10 #include<stdlib.h>
11 #include <grpcpp/grpcpp.h>
12 
13 
14 std::unique_ptr<example::Greeter::Stub> CreateGreeterStub() {
15     auto channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials());
16     return example::Greeter::NewStub(channel);
17 }
18 
19 void SayHello(std::unique_ptr<example::Greeter::Stub>& stub, const std::string& user) {
20     example::HelloRequest request;
21     request.set_name(user);
22 
23     example::HelloResponse response;
24     grpc::ClientContext context;
25 
26     grpc::Status status = grpc::Status::OK;
27         
28     status = stub->SayHello(&context, request, &response);
29 
30     if (status.ok()) {
31         std::cout << "Greeter received: " << response.message() << std::endl;
32     }
33     else {
34         std::cout << "RPC failed" << std::endl;
35     }
36 }
37 
38 
39 
40 int main()
41 {
42     std::unique_ptr<example::Greeter::Stub> stub = CreateGreeterStub();
43     std::string user("world");
44     SayHello(stub, user);
45     return 0;
46 }
复制代码

 运行:

 

posted @   钟齐峰  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示