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 }
运行:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架