Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在使用CMake生成后将目录的内容复制到生成目录中?_C++_Cmake - Fatal编程技术网

C++ 如何在使用CMake生成后将目录的内容复制到生成目录中?

C++ 如何在使用CMake生成后将目录的内容复制到生成目录中?,c++,cmake,C++,Cmake,我在源文件旁边的config目录中有一些配置文件(xml,ini,…)。如何在每次创建项目时将config目录中的所有文件复制到build目录(在可执行文件旁边)?CMake支持shell类型的文件复制。这个链接应该对您很有帮助-在我的项目中,我使用INSTALL在CMake中指定我使用conf文件移动二进制文件的内容和位置。执行cmake后,使用“make install”。您可以使用 假设您的目标名为MyTarget,则可以执行以下操作: add_custom_command(TARGET

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

CMake支持shell类型的文件复制。这个链接应该对您很有帮助-

在我的项目中,我使用INSTALL在CMake中指定我使用conf文件移动二进制文件的内容和位置。执行cmake后,使用“make install”。

您可以使用

假设您的目标名为
MyTarget
,则可以执行以下操作:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)
add_custom_命令(TARGET MyTarget PRE_BUILD
COMMAND${CMAKE_COMMAND}-E copy_目录
${CMAKE\u SOURCE\u DIR}/config/$)
每次构建
MyTarget
并将“/config”的内容复制到目标exe/lib的最终目录时,都会执行此操作

正如下面的一条评论所指出的,在
add\u custom\u命令
中将
PRE\u BUILD
替换为
POST\u BUILD
,可以确保只有在生成成功时才会进行复制

解释
  • ${CMAKE_COMMAND}
    是指向CMAKE的路径
  • -E
    使CMake运行命令而不是生成
  • copy\u目录
    是一个
  • config
    是将内容复制到构建目标的目录(位于项目根目录下)
  • $
    是一个生成器表达式,在
    add\u custom\u命令
    文档中进行了描述

除了最重要的答案

要复制目录本身而不是内容,可以将
/${FOLDER\u 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)
add_custom_命令(目标${PROJECT_NAME}POST_BUILD
COMMAND${CMAKE_COMMAND}-E copy_目录
${CMAKE_SOURCE_DIR}/config$/config)

CMakeLists.txt中的一个实际目标-即通过
add\u executable
add\u library
添加的东西。是的-我认为
make
足够聪明,如果检测到它没有变化,甚至不会执行
make MyTarget
。如果目标中有任何更改,则make将在该目标上执行,文件将被复制。POST_BUILD可能是更好的选择,这意味着只有在生成成功的情况下才会复制文件。是否有方法使
make clean
意识到在项目清理时必须删除复制的文件?是否有方法复制目录本身而不是内容?OP询问如何在生成完成后执行此操作。这意味着没有在shell中输入另一个命令。执行构建并将二进制文件神奇地放在那里。我也使用
install()
命令,但这是针对一种特殊情况的:代码生成,通过单元测试,并准备好供其他人使用。我安装它不是为了调试它。