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脚本中即可:
- 先编写独立的复制脚本
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})
- 在生成目标的第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级子目录的构建逻辑依赖复制后的文件,需要显式声明构建顺序依赖:
- 先为复制操作声明独立的全局自定义目标:
# 放在第4级子目录CMakeLists中,DEPENDS确保先编译目标再执行复制 add_custom_target(CopyGeneratedFiles ALL DEPENDS MyApp)
- 在第5、6级子目录中,给需要用到复制文件的目标添加依赖:
# 替换MyLaterTarget为实际的子目录目标名 add_dependencies(MyLaterTarget CopyGeneratedFiles)
内容的提问来源于stack exchange,提问作者El-Sayed Hamed
相关产品推荐
相关产品推荐

