首页 > 解决方案 > 为什么下面的CMakeLists.txt不能生成*.proto(protobuf)系列的输出文件

问题描述

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

下面是我写的CMakeLists.txt,但是现在不能生成任何*.pb.h或者*.pb.cc。谁能告诉我我的 CMakeLists.txt 有什么问题?谢谢。

我使用的cmake版本是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()

标签: cmakeprotocol-buffersprotobuf-c

解决方案


根据文档,函数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})

推荐阅读