【发布时间】: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.txt 和 a.txt.h 上的时间戳匹配,并且比 exe 的时间戳更新。
参考文献
【问题讨论】:
-
而且
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