为什么下面的CMakeLists.txt无法生成*.proto(protobuf)系列的输出文件



我不熟悉cmake和protobuf。我想编写一个 CMakeLists.txt以帮助我将指定目录中的所有 protobuf 文件生成到另一个指定目录中。

以下是我写.txt CMakeLists,但它现在无法生成任何 *.pb.h 或 *.pb.cc。任何人都可以告诉我我的CMakeLists有什么问题.txt?谢谢。

我使用的 cmake vesion 是 3.12,protoc 版本是 3.12。

file(GLOB_RECURSE children LIST_DIRECTORIES true "${CMAKE_CURRENT_SOURCE_DIR}/protos/*.proto")
SET(PROTO_META_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp)
FOREACH(FIL ${children})
GET_FILENAME_COMPONENT(ABS_FIL ${FIL} ABSOLUTE)
GET_FILENAME_COMPONENT(FIL_WE ${FIL} NAME_WE)
LIST(APPEND PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp/${FIL_WE}.pb.cc")
LIST(APPEND PROTO_HDRS "${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp/${FIL_WE}.pb.h")
#   EXECUTE_PROCESS(
#       COMMAND PROTOBUF_GENERATE_CPP --cpp_out=${PROTO_META_BASE_DIR} ${FIL}
#       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/protos
#   )
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HDR ${CMAKE_SOURCE_DIR}/protos/${FIL})
ENDFOREACH()

根据文档,该函数PROTOBUF_GENERATE_CPP创建一个自定义命令,该命令OUTPUT列出结果文件。因此,除非有一个目标将这些文件用作依赖项,否则不会生成任何内容。

最直接的方法是将文件用作add_executable的来源:

add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})

文档中描述了这种方式。

如果出于某种原因,您不想从结果文件中创建任何内容,则可以创建一个使用这些文件的自定义目标

add_custom_target(my_command ALL DEPENDS ${PROTO_SRCS} ${PROTO_HDRS})

最新更新