gpt4 book ai didi

CMake 的目标依赖于子目录中生成的文件

转载 作者:行者123 更新时间:2023-12-05 07:39:51 24 4
gpt4 key购买 nike

我有一个场景,我认为与这个非常相似:CMake add_custom_command/_target in different directories for cross-compilation ,但是该问题的解决方案对我不起作用。

在 subdir/CMakeLists.txt 我有:

add_custom_command(OUTPUT foo.h foo.cpp COMMAND ... DEPENDS foo.xml)
add_custom_target(generate_foo DEPENDS foo.h foo.cpp)

然后是 CMakeLists.txt:

add_executable(MyTarget
subdir/foo.h
subdir/foo.cpp
${OTHER_SOURCES})
add_dependencies(MyTarget generate_foo)
add_subdirectory(subdir)

失败并显示“无法找到源文件:subdir/foo.h”。 add_dependencies 的文档表明它将确保 generate_foo 在 MyTarget 之前构建,但如果是这种情况,它看起来至少在任一目标构建之前尝试访问所有源文件。我在这里做错了什么吗?如何编译由子目录中的自定义目标/命令生成的源文件?

最佳答案

问题是 GENERATED 文件属性(CMake 使用它来确定是否需要在配置时检查文件是否存在)在生成文件的目录之外是不可见的。这个问题在 CMake 3.20 中消失了。这是解释here .

我通常通过将生成的源文件编译到子目录中的静态或对象库,然后链接到它来解决这个问题,因为目标是全局可见的。您还可以在您希望使用的范围内对生成的文件显式设置 GENERATED 属性,但这种 hack 破坏了通过使用子目录获得的封装。

还值得注意的是,您可以取消自定义目标和对 add_dependencies 的调用,因为生成的文件已经是可执行文件的依赖项(AFAIK 一直都是这种情况)。

关于CMake 的目标依赖于子目录中生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46795065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com