【问题标题】:Why does the following CMakeLists.txt cannot generate the output file of series of *.proto(protobuf)为什么下面的CMakeLists.txt不能生成*.proto(protobuf)系列的输出文件
【发布时间】:2020-07-04 08:07:50
【问题描述】:

我不熟悉 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()

【问题讨论】:

    标签: cmake protocol-buffers protobuf-c


    【解决方案1】:

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

    最直接的方法是使用文件作为add_executable的源:

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

    这种方式在文档中有描述。

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

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

    【讨论】:

    • 如果我只想生成 protobuf 文件的 *.cc 或 *.h,但不使用生成的文件,这是否意味着 protobuf_generate_cpp 不会为我生成 *.cc 或 *.h ?
    • 您可以创建一个使用这些文件的自定义目标add_custom_target(my_command ALL DEPENDS ${PROTO_SRCS} ${PROTO_HDRS})。我已经更新了该案例的答案。
    • 我在 CMakeLists.txt 的最后添加“add_custom_target(my_command ALL DEPENDS ${PROTO_SRCS} ${PROTO_HDRS})”,并构建它,但它报告了错误:-(
    • 它会产生什么错误?在我的回答中,我假设 PROTO_SRCSPROTO_HDRS 作为前两个参数传递给 PROTOBUF_GENERATE_CPP 函数。您的代码似乎通过了PROTO_SRCPROTO_HDRS(没有最终的S)。
    • 哦,对不起,我错过了某个函数末尾的')'。它对我不起作用,我在 protos_cpp_hpp 目录中没有找到任何生成的 *.pb.h 或 *.pb.cc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多