You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake构建后复制中间目标文件,file(GLOB)失效的替代方案咨询

CMake构建后复制生成文件的可行方案

原方案失效原因

file(GLOB) 属于CMake配置阶段命令,执行时机为运行cmake生成构建系统的阶段,此时项目还未开始编译,所有待复制的生成文件均不存在,因此匹配结果为空,复制操作自然无效。

可行实现方案

方案1:直接绑定目标的后置构建命令(推荐)

如果待复制的文件属于已知的构建目标(比如第4级子目录用add_executable生成的目标),直接通过生成器表达式获取文件路径,绑定到目标的后置构建事件中即可,无需手动匹配路径:

# 替换MyApp为你实际生成的目标名
add_custom_command(TARGET MyApp POST_BUILD
    # 复制目标的所有中间对象文件 + 最终可执行文件到指定目录
    COMMAND ${CMAKE_COMMAND} -E copy 
        $<TARGET_OBJECTS:MyApp>
        $<TARGET_FILE:MyApp>
        ${OBJECTS_FOLDER}
    COMMENT "Copying target outputs to objects directory"
)

优势:无需手动匹配路径,跨平台兼容,天然和目标构建顺序绑定,不会出现文件未生成就复制的问题。

方案2:构建阶段执行批量匹配脚本

如果确实需要批量匹配多目录下的生成文件,把匹配逻辑放到构建阶段执行的独立CMake脚本中即可:

  1. 先编写独立的复制脚本cmake/CopyGeneratedFiles.cmake:
# 脚本内的file(GLOB)是构建阶段执行,此时文件已生成
file(GLOB OUTPUT_COMPILED_FILES_POST
    "${SEARCH_ROOT}/IntCode/*/*"
    "${SEARCH_ROOT}/ApplicationComps/*/src/Common/*.*"
)
file(COPY ${OUTPUT_COMPILED_FILES_POST} DESTINATION ${OBJECTS_FOLDER})
  1. 在生成目标的第4级子目录CMakeLists中绑定执行逻辑:
add_custom_command(TARGET MyApp POST_BUILD
    COMMAND ${CMAKE_COMMAND} 
        -D SEARCH_ROOT=${CMAKE_CURRENT_BINARY_DIR}
        -D OBJECTS_FOLDER=${OBJECTS_FOLDER}
        -P ${CMAKE_SOURCE_DIR}/cmake/CopyGeneratedFiles.cmake
    COMMENT "Batching copy generated compiled files"
)

处理多级子目录依赖

如果第5、6级子目录的构建逻辑依赖复制后的文件,需要显式声明构建顺序依赖:

  1. 先为复制操作声明独立的全局自定义目标:
# 放在第4级子目录CMakeLists中,DEPENDS确保先编译目标再执行复制
add_custom_target(CopyGeneratedFiles ALL DEPENDS MyApp)
  1. 在第5、6级子目录中,给需要用到复制文件的目标添加依赖:
# 替换MyLaterTarget为实际的子目录目标名
add_dependencies(MyLaterTarget CopyGeneratedFiles)

内容的提问来源于stack exchange,提问作者El-Sayed Hamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:30:02