如何使用 vcpkg 工具链在 CMake 中删除 --plugin=protoc-gen-grpc 的硬编码路径

How to remove hardcoded path for --plugin=protoc-gen-grpc in CMake using vcpkg toolchain

我有一个使用 CMake 在 C++ 中构建 grpc 库的工作示例。 但是我需要硬编码标志的绝对路径 --plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"

我真正想做的是为所需的 grpc_cpp_plugin 找到类似环境变量 ${PROTOBUF_PROTOC_EXECUTABLE} 的东西,但我找不到它。即 ${GPRC_CPP_PLUGIN_EXECUTABLE}

有谁知道我是否漏掉了一些简单的东西?

这是我对 CMakeLists.txt

的完整列表
project(hello_contract_library)

set(CMAKE_VERBOSE_MAKEFILE ON)

find_package(protobuf CONFIG REQUIRED)
#target_link_libraries(main PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)

set(GENERATED_DIR "${PROJECT_SOURCE_DIR}/generated")
file(MAKE_DIRECTORY "${GENERATED_DIR}")

set(hello_src "${GENERATED_DIR}/hello.pb.cc")
set(hello_hdr "${GENERATED_DIR}/hello.pb.h")
set(hello_grpc_src  "${GENERATED_DIR}/hello.grpc.pb.cc")
set(hello_grpc_hdr  "${GENERATED_DIR}/hello.grpc.pb.h")

# Added to include generated header files
include_directories("${GENERATED_DIR}")

add_custom_command(
      OUTPUT "${hello_src}" "${hello_hdr}" "${hello_grpc_src}" "${hello_grpc_hdr}"
      COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
      ARGS --grpc_out "${PROJECT_SOURCE_DIR}/generated"
        --cpp_out "${PROJECT_SOURCE_DIR}/generated"
        -I "/home/myusername/dev/lab/MiniGL/src/backend/public/contracts"
        --plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"
        "hello.proto"
      DEPENDS "hello.proto")

add_library(${PROJECT_NAME}
  ${hello_src}
  ${hello_hdr}
  ${hello_grpc_src}
  ${hello_grpc_hdr})

目前获得此信息的唯一方法是创建您自己的 .cmake 文件来查找这些可执行文件并定义此变量。幸运的是 Google 有一个例子 here。您可以将 common.cmake 复制到您将包含到项目中的 cmake 目录。

这会给你 ${_GRPC_CPP_PLUGIN_EXECUTABLE} 用于你的 --plugin${_GRPC_GRPCPP} 放入你的 target_link_libraries.

例子

根目录下

# common project setup

include(cmake/common.cmake) # comes from Google examples
add_subdirectory(proto)

在原型目录中

# Proto files
set(my_protos
    test.proto
)

# Generated sources
set(my_protos_srcs
    ${CMAKE_BINARY_DIR}/proto/test.pb.cc
)
set(my_protos_hdrs
    ${CMAKE_BINARY_DIR}/proto/test.pb.h
)

add_custom_command(
    OUTPUT ${my_protos_srcs} ${my_protos_hdrs}
    COMMAND ${_PROTOBUF_PROTOC}
    ARGS --cpp_out ${CMAKE_BINARY_DIR}/proto
        --grpc_out ${CMAKE_BINARY_DIR}/proto
        -I ${CMAKE_SOURCE_DIR}/proto
        --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
        ${my_protos} 
    DEPENDS ${my_protos}
)

add_library(protos
    ${my_protos_srcs}
    ${my_protos_hdrs}
)
target_link_libraries(protos
    ${_PROTOBUF_LIBPROTOBUF}
    ${_GRPC_GRPCPP}
)