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

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

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

#标记最低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 @ 2022-09-15 11:08  缙云烧饼  阅读(2118)  评论(0)    收藏  举报