【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()

浙公網安備 33010602011771號