【问题标题】:CMAKE - Glob files in post buildCMAKE - 后期构建中的 Glob 文件
【发布时间】:2021-10-20 08:12:12
【问题描述】:

我想将中间对象文件从 build 文件夹复制到另一个文件夹。 我用过:file(GLOB OUTPUT_COMPILED_FILES_POST CONFIGURE_DEPENDS "IntCode/*/*" "ApplicationComps/*/src/Common/*.*)" 收集文件的名称,因为它们很多。

然后我使用file(COPY ${OUTPUT_COMPILED_FILES_POST} DESTINATION ${OBJECTS_FOLDER}) 复制文件,但它没有做任何事情,因为当 glob 命令工作时,文件尚未生成。

我有多个子目录,第四个有 add_executable 生成目标文件和 exe 文件第五和第六个子目录需要一些目标文件。

所以。我的问题:

还有其他方法吗?

【问题讨论】:

  • 您这样做的目的是什么?如果您使用它们来构建另一个目标,您是否尝试过将它们设为 OBJECT 库?
  • 我同意 Dorito Johnson 的观点;因此似乎非常不明智。 What are you actually trying to do?
  • 通常这种任务最好使用install 命令来完成。除了使用对象库之外,您可能还需要为此目标的安装命令,并在配置时设置指定安装前缀路径。
  • 一旦 add_executable 完成生成 exe 文件,我将尝试从 build 文件夹中复制对象文件。我有多个子目录,第 4 个子目录有 add_executable,它生成目标文件和 exe 文件,第五和第六个子目录需要一些目标文件。
  • "我有多个子目录,第四个有 add_executable 生成目标文件和 exe 文件,第五和第六个子目录需要一些目标文件。"将此详细信息添加到您的问题中。

标签: cmake copy glob


【解决方案1】:

如果你可以重构你的 glob 而只复制某个目录下的文件,你可以使用这个命令

add_custom_command(TARGET bar
    # Run after all other rules within the target have been executed
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory source destination
    COMMENT "This command will be executed after building bar"
)

【讨论】:

  • 没有 CONFIGURE_DEPENDS 就不要使用 glob,但更好的是,不要 glob。
  • message 没有 STATUS 参数会打印到 stderr,这可能会破坏某些 CI 系统
  • @AlexReinking 听起来你想让我从我给出的答案中删除那些;那是对的吗?我已经编辑了我的答案。
  • 由于提供的原因,我对答案投了反对票,但由于答案得到了改进,我对答案投了赞成票。
【解决方案2】:

我有多个子目录,第四个有 add_executable 生成目标文件和 exe 文件第五和第六个子目录需要一些目标文件。

您可以使用 CMake 中的对象库来实现这一点。请参阅下面的草图和文档:

假设您有一个更高级别的 CMakeLists.txt 文件,其中包含:

...
add_subdirectory(subdir1)
add_subdirectory(subdir2)
add_subdirectory(subdir3)
add_subdirectory(subdir4)
add_subdirectory(subdir5)
add_subdirectory(subdir6)
...

然后在 subdir4 的 CMakeLists.txt 中你会写:

add_library(target4objs OBJECT src1.cpp src2.cpp ...)
add_executable(target4 extra_src_not_shared.cpp ...)
target_link_libraries(target4 PRIVATE target4objs)

在 subdir5/6 中你会写:

add_executable(target5 src1.cpp ...)
target_link_libraries(target5 PRIVATE target4objs)

一般建议:手动将文件从构建树复制到构建树的其他位置,或者特别是复制到源代码树实际上是不需要的,而且是个坏主意。

【讨论】:

  • 我有一个实际的例子;我想将 GLSL 着色器源文件复制到构建输出,因为我从调试目录运行调试可执行文件。当可执行文件运行时,它会查找着色器源并在运行时编译和链接它们。最初的问题是我很好奇您将如何支持您显示的那些随机链接。这些链接中没有资源文件夹。
  • @activedecay - 听起来你想ask a new question
  • 听起来你认为我们应该vote to close this question
  • @activedecay - 不,我认为我们不应该结束这个问题。在我看来,您的评论与我的回答或这个问题无关。
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多