使用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
相关产品推荐
相关产品推荐

