【gRPC】C++下使用CMakeLists快速构建项目

ShaoBing·2022-09-15 11:08·1644 次阅读

【gRPC】C++下使用CMakeLists快速构建项目

在gRPC中,编写.proto文件(protocol buffer文件)来定义RPC服务的接口是第一步

先通过proto的代码生成器编译生成pb.h、pb.cc、grpc.pb.h、grpc.pb.cc。然后在编写client和server时引入头文件进行使用。以下的代码能帮助我们快速的生成以上的四个文件并编译client和server到可执行文件,根据需求修改内容即可

Copy
#标记最低CMake版本 cmake_minimum_required(VERSION 3.5.1) #项目名称及使用语言情况 project(HelloWorld C CXX) #指定本地的CMake程序位置,如果电脑上在不同位置都安装了CMake,可以依次往后附加,此处添加的为官网教程安装位置 list(APPEND CMAKE_PREFIX_PATH "/home/$ENV{USER}/.local/bin") #查找本地Protobuf模块的库信息,实际上CMake就是在找Protobuf-config.cmake文件 set(protobuf_MODULE_COMPATIBLE TRUE) find_package(Protobuf CONFIG REQUIRED) message(STATUS "Using protobuf ${Protobuf_VERSION}") set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) set(_REFLECTION gRPC::grpc++_reflection) if(CMAKE_CROSSCOMPILING) find_program(_PROTOBUF_PROTOC protoc) else() set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>) endif() # Find gRPC installation # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. #查找本地gRPC模块的库信息 find_package(gRPC CONFIG REQUIRED) message(STATUS "Using gRPC ${gRPC_VERSION}") set(_GRPC_GRPCPP gRPC::grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) endif() # Proto file get_filename_component(data_proto "../data.proto" ABSOLUTE) get_filename_component(data_proto_path "${data_proto}" PATH) # Generated sources #代码生成器的目标文件位置 set(data_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/data.pb.cc") set(data_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/data.pb.h") set(data_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/data.grpc.pb.cc") set(data_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/data.grpc.pb.h") #代码生成器脚本,根据proto文件生成C++的四个文件 add_custom_command( OUTPUT "${data_proto_srcs}" "${data_proto_hdrs}" "${data_grpc_srcs}" "${data_grpc_hdrs}" COMMAND ${_PROTOBUF_PROTOC} ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" --cpp_out "${CMAKE_CURRENT_BINARY_DIR}" -I "${data_proto_path}" --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" "${data_proto}" DEPENDS "${data_proto}") #到这里为止,代码生成器部分结束,以下为对项目的编译链接 # Include generated *.pb.h files #项目include目录,可以在后面不断添加项目使用的头文件的目录位置 include_directories("${CMAKE_CURRENT_BINARY_DIR}") #将grpc的四个文件编译成一个库 # data_grpc_proto add_library(data_grpc_proto ${data_grpc_srcs} ${data_grpc_hdrs} ${data_proto_srcs} ${data_proto_hdrs}) #链接库data_grpc_proto,会生成链接文件 target_link_libraries(data_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF}) #编译链接server和client,这里需要自己提前写好,否则会报错哟 # Targets [async_](client|server) foreach(_target client server) add_executable(${_target} "${_target}.cpp") target_link_libraries(${_target} data_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF}) endforeach()
posted @   缙云烧饼  阅读(1644)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示