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

使用CMake批量复制配置文件到构建目录失败求助

问题分析与解决方案

你的代码核心问题在于**cmake -E copy命令不支持一次性复制多个源文件到目录**。该命令的默认逻辑是:若传入多个参数,最后一个参数会被当作目标文件而非目录,导致你的文件被错误处理,因此没有报错但达不到预期效果。

解决方案

方案1:直接复制整个配置目录(推荐)

如果需要保留config目录的结构,直接用copy_directory命令更简洁,无需手动匹配文件:

add_custom_command(
    TARGET CMakeSFMLProject
    COMMENT "Copy config directory"
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${PROJECT_SOURCE_DIR}/myprog/config"
        "$<TARGET_FILE_DIR:CMakeSFMLProject>/config"
    VERBATIM
)

该命令会将源目录下的所有文件和子目录完整复制到目标路径。

方案2:逐个复制匹配的文件

若只需复制文件(不需要保留原目录结构),可以用foreach循环逐个处理每个配置文件:

file(GLOB_RECURSE myprog_cfg "myprog/config/*")

foreach(cfg_file IN LISTS myprog_cfg)
    add_custom_command(
        TARGET CMakeSFMLProject
        COMMENT "Copy ${cfg_file}"
        PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${cfg_file}"
            "$<TARGET_FILE_DIR:CMakeSFMLProject>"
        VERBATIM
    )
endforeach()

使用copy_if_different替代copy,仅在源文件修改时才执行复制,避免不必要的构建操作。

方案3:批量复制到目录(利用copy_if_different)

copy_if_different命令支持一次性传入多个源文件并复制到目标目录,结合COMMAND_EXPAND_LISTS即可实现批量复制:

file(GLOB_RECURSE myprog_cfg "myprog/config/*")

add_custom_command(
    TARGET CMakeSFMLProject
    COMMENT "Copy config files"
    PRE_BUILD
    COMMAND_EXPAND_LISTS
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${myprog_cfg}
        "$<TARGET_FILE_DIR:CMakeSFMLProject>"
    VERBATIM
)

这里的关键是将原命令中的copy替换为copy_if_different,后者支持多源文件到目录的复制逻辑。

内容的提问来源于stack exchange,提问作者user2393256

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:12