【问题标题】:Dirty generated header doesn't rebuild dependant target脏生成的标头不会重建依赖目标
【发布时间】:2021-12-28 00:07:12
【问题描述】:

我有一个目标,它的SOURCES 中有一些标题;这些是使用add_custom_command 生成的。这是摘录

set(MY_SOURCES
  a.txt
  b.txt)

set(MY_HEADERS)
foreach (TXT ${MY_SOURCES})
  add_custom_command(OUTPUT ${TXT}.h
    COMMAND txt2h
    -i "${CMAKE_CURRENT_SOURCE_DIR}/${TXT}"
    -o "${TXT}.h"
    MAIN_DEPENDENCY ${TXT}
    COMMENT "Generating header from ${TXT}"
    VERBATIM)
  list(APPEND MY_HEADERS "${CMAKE_CURRENT_BINARY_DIR}/${TXT}.h")
endforeach ()

add_executable(exe main.cpp ${MY_HEADERS})
target_include_directories(exe PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

这会生成 (cmake -B build) 并构建 (cmake --build build) 正常。

当我编辑 a.txt 并运行 cmake --build build 时。自从我看到它会重新生成a.txt.h

从 a.txt 生成标题

但是,exe 目标未构建。由于生成的标头被列为exe 的来源,我希望它也应该使exe 变脏并重建它。我错过了什么?

我验证了 a.txta.txt.h 上的时间戳匹配,并且比 exe 的时间戳更新。

参考文献

  1. Adding a custom command and generated file(CMake 官方教程)
  2. Generated sources in CMake builds

【问题讨论】:

  • 而且add_executable(exe main.cpp ${MY_HEADERS}) 看起来还是不对的。如果我没记错的话,这会将标头视为实现文件。
  • 我经常看到add_executable 中列出的标题。这样可以确保在标头更改时重建可执行文件,不是吗?如果放在那里,IDE 还会列出标头;见stackoverflow.com/questions/36174499/…
  • However, the exe target isn't built. "exe target" 以何种方式依赖于标头? main.cpp 是否包含它? IE。 究竟应该重建什么,当"${TXT}.h" 发生变化时,应该以什么方式重建?
  • 不,不应该。可执行文件依赖于目标文件,目标文件依赖于 cpp 文件。没有 cpp 文件改变 -> 没有目标文件改变 -> 不需要重建可执行文件。除非 cpp 文件包含头文件,在这种情况下它取决于它。将头文件添加到add_executable 只会使它们显示在某些 ide 中。
  • @KamilCuk 哦,谢谢。那很可能就是问题所在。

标签: cmake


【解决方案1】:

头文件没有被编译。可执行文件依赖于由cpp 文件生成的目标文件。只有当cpp文件中的一个包含header时,才需要在header变化时重新编译,然后在header变化时重新编译可执行文件。

将标头添加到add_executable 仅使其在某些IDE 中显示,没有效果。

【讨论】:

  • 晶莹剔透!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多