如何使用gRPC编写HelloWorld CMake

如何使用gRPC编写HelloWorld CMake,cmake,protocol-buffers,grpc,Cmake,Protocol Buffers,Grpc,我已经按照gRPC网站的快速入门说明进行了操作 我还使用他们的cmake文件在构建树中成功构建了他们的HelloWorld示例 现在我想在HelloWorld的构建之外构建我自己的项目,使用已经构建和安装的gRPC,以表明我能够构建一个实际的项目 我已复制粘贴了他们的大部分cmake,但我得到一个错误: ====================[ Build | gRPC_demo | Debug ]=============================== /usr/bin/cmake3

我已经按照gRPC网站的快速入门说明进行了操作

我还使用他们的cmake文件在构建树中成功构建了他们的HelloWorld示例

现在我想在HelloWorld的构建之外构建我自己的项目,使用已经构建和安装的gRPC,以表明我能够构建一个实际的项目

我已复制粘贴了他们的大部分cmake,但我得到一个错误:

====================[ Build | gRPC_demo | Debug ]===============================
/usr/bin/cmake3 --build /home/cpisz/git-workspace/gRPC_demo/cmake-build-debug --target gRPC_demo -- -j 12
gmake[3]: *** No rule to make target '/protos/helloworld.proto', needed by 'helloworld.pb.cc'.  Stop.
gmake[2]: *** [CMakeFiles/Makefile2:95: CMakeFiles/gRPC_demo.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:103: CMakeFiles/gRPC_demo.dir/rule] Error 2
gmake: *** [Makefile:138: gRPC_demo] Error 2
我的构建树如下所示:

gRPC_demo
    protos
        helloworld.proto
    main.cpp
    CMakeLists.txt
cmake内容如下所示:

cmake_minimum_required(VERSION 3.5.1)

project(gRPC_demo)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

# Threads
find_package(Threads REQUIRED)

# Protobuf
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)
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)

# gRPC
find_package(gRPC CONFIG REQUIRED)
message(STATUS "Using gRPC ${gRPC_VERSION}")

set(_GRPC_GRPCPP gRPC::grpc++)
set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)

# Proto file
get_filename_component(hw_proto "/protos/helloworld.proto" ABSOLUTE)
get_filename_component(hw_proto_path "${hw_proto}" PATH)

# Generated sources
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc")
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h")
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")

add_custom_command(
    OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" 
"${hw_grpc_hdrs}"
    COMMAND ${_PROTOBUF_PROTOC}
    ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
    --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
    -I "${hw_proto_path}"
    --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
    "${hw_proto}"
    DEPENDS "${hw_proto}")

# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")

# Target
add_executable(gRPC_demo
    main.cpp
    ${hw_proto_srcs}
    ${hw_grpc_srcs}
)

target_link_libraries(gRPC_demo
    ${_REFLECTION}
    ${_GRPC_GRPCPP}
    ${_PROTOBUF_LIBPROTOBUF}
)    
cmake_最低要求(3.5.1版)
项目(gRPC_演示)
设置(CMAKE_CXX_标志“${CMAKE_CXX_标志}-std=c++17”)
#线程
查找_包(需要线程)
#Protobuf
设置(protobuf_模块兼容TRUE)
查找_包(需要Protobuf配置)
消息(状态“正在使用protobuf${protobuf_VERSION}”)
集合(_PROTOBUF_LIBPROTOBUF PROTOBUF::LIBPROTOBUF)
集合(_反射gRPC::gRPC++_反射)
集合(_PROTOBUF_PROTOC$)
#gRPC
查找_包(需要gRPC配置)
消息(状态“正在使用gRPC${gRPC_VERSION}”)
集合(_GRPC_GRPCPP GRPC::GRPC++)
set(_GRPC_CPP_PLUGIN_EXECUTABLE$)
#原始文件
获取组件(hw_proto)/protos/helloworld.proto“绝对值)
获取_文件名_组件(hw_proto_路径“${hw_proto}”路径)
#生成源
set(hw_proto_srcs“${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc”)
set(hw_proto_hdrs“${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h”)
set(hw_grpc_srcs“${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc”)
集合(hw_grpc_hdrs“${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h”)
添加自定义命令(
输出“${hw_proto_srcs}”${hw_proto_hdrs}”${hw_grpc_srcs}”
“${hw_grpc_hdrs}”
命令${u PROTOBUF\u PROTOC}
ARGS—grpc_out“${CMAKE_CURRENT_BINARY_DIR}”
--cpp_out“${CMAKE_CURRENT_BINARY_DIR}”
-I“${hw_proto_path}”
--plugin=protoc gen grpc=“${u grpc\u CPP\u plugin\u EXECUTABLE}”
“${hw_proto}”
取决于“${hw_proto}”)
#包括生成的*.pb.h文件
包括目录(${CMAKE\u CURRENT\u BINARY\u DIR}”)
#目标
添加可执行文件(gRPC\U演示
main.cpp
${hw_proto_srcs}
${hw_grpc_srcs}
)
目标链接库(gRPC\U演示)
${u反射}
${u GRPC_GRPCPP}
${u PROTOBUF_LIBPROTOBUF}
)    

我对使用cmake很陌生。我做错了什么?

而不是
/protos/helloworld.proto
,后者是绝对路径(因为前导斜杠),您可能需要使用
protos/helloworld.proto
。好东西。现在可以工作了,谢谢protobuf 3.12您可以使用它的
protobuf_generate
命令来调用protoc,并使用gRPC插件的
PLUGIN
选项。您不再需要使用自定义命令。有一篇博客文章解释了如何使用它: