使用CMake后如何将目录内容复制到build目录?

Mey*_*sam 67 c++ cmake

config在源文件旁边的目录中有一些配置文件(xml,ini,...).如何在每次创建项目时将config目录中的所有文件复制到构建目录(可执行文件旁边)?

Fra*_*ser 116

你可以用add_custom_command.

说你的目标被调用MyTarget,然后你可以这样做:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)
Run Code Online (Sandbox Code Playgroud)

每次构建MyTarget并将"/ config"的内容复制到目标exe/lib最终的目录时,都会执行此操作.

正如马克Lakata在下面评论指出,更换PRE_BUILDPOST_BUILDadd_custom_command确保复制如果生成成功才会发生.

说明

  • ${CMAKE_COMMAND} 是CMake的路径
  • -E 使CMake运行命令而不是构建
  • copy_directory是一个命令行工具
  • config是一个生成器表达式,在$<TARGET_FILE_DIR:MyTarget>文档中描述.

  • 有没有办法让`make clean`知道在项目清理时必须删除复制的文件? (6认同)
  • POST_BUILD可能是更好的选择,这意味着只有在构建成功时才会复制文件. (5认同)
  • 有没有办法复制目录本身而不是内容? (3认同)

小智 19

除了最佳答案,

要复制目录本身而不是内容,您可以添加/${FOLDER_NAME}到第二个参数的末尾。

像这样:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)
Run Code Online (Sandbox Code Playgroud)


sat*_*tk0 6

使用符号链接[仅限开发!]


CMake 通过以下方式启用符号链接create_symlink

add_custom_command(TARGET ${CMAKE_PROJECT_NAME} PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E create_symlink
                   ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)
Run Code Online (Sandbox Code Playgroud)

它确保当您对目录中的文件进行更改时,构建文件夹将随后更新。

然而,正如@Vallerious指出的那样,它只是一个仅用于开发的解决方案,因为它并没有真正复制目录内容。它只是将它们联系起来。

  • 但是,如果您正在构建一个版本,则符号链接将不起作用,因为您没有就位文件。您要解决的问题是,调试和发布之间的路径是相同的,但在发布时仍然需要不同的命令来复制内容。 (3认同)

raj*_*esh 5

CMake支持shell类型的文件副本.此链接应该对您有所帮助 - 如何将目录从源树复制到二叉树?