【问题标题】:How to copy contents of a directory into build directory after make with CMake?使用 CMake 制作后如何将目录的内容复制到构建目录中?
【发布时间】:2012-11-05 22:47:33
【问题描述】:

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

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    您可以使用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>)
    

    每次构建 MyTarget 时都会执行此操作,并将“/config”的内容复制到目标 exe/lib 将结束的目录中。

    正如Mark Lakata 在下面的评论中指出的那样,将add_custom_command 中的PRE_BUILD 替换为POST_BUILD 可确保只有在构建成功时才会进行复制。

    说明

    • ${CMAKE_COMMAND} 是 CMake 的路径
    • -E 使 CMake 运行命令而不是构建
    • copy_directoryCommand-Line Tool
    • config 是目录(位于项目的根目录下),其内容将被复制到构建目标中
    • $&lt;TARGET_FILE_DIR:MyTarget&gt; 是一个生成器表达式,在add_custom_command 文档中进行了描述。

    【讨论】:

    • CMakeLists.txt 中的实际目标之一 - 即通过 add_executableadd_library 添加的内容。
    • 是的 - 我认为 make 足够聪明,如果它检测到它没有改变,甚至不会执行 make MyTarget。如果您的目标发生任何变化,那么 make 将在该目标上执行,并且文件将被复制。
    • POST_BUILD 可能是一个更好的选择,这意味着只有在构建成功时才会复制文件。
    • 有没有办法让make clean意识到项目清理时必须删除复制的文件?
    • 有没有办法复制目录本身而不是内容?
    【解决方案2】:

    除了最上面的答案,

    要复制目录本身而不是内容,可以在第二个参数末尾添加/${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)
    

    【讨论】:

      【解决方案3】:

      CMake 支持 shell 类型的文件复制。这个链接应该对你有帮助 - How to copy directory from source tree to binary tree?

      【讨论】:

        【解决方案4】:

        使用符号链接


        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)
        

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

        【讨论】:

        • 喜欢这个!谢谢!
        【解决方案5】:

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

        【讨论】:

        • OP 询问如何在构建完成后执行此操作。暗示是没有另一个命令输入到 shell 中。执行构建并 poof 你的二进制文件需要的文件神奇地在那里。我也使用install() 命令,但这是针对一种特殊情况:代码构建、通过单元测试,并准备好供其他人使用。我不安装它来调试它。
        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2011-09-07
        相关资源
        最近更新 更多