CMake:将自定义资源添加到构建目录

24

我正在制作一个小程序,需要一个名为foo.bmp的图像文件才能运行
所以我可以编译程序,但是要运行它,我必须手动将foo.bmp复制到“build”子目录中

我应该在CMakeLists.txt中使用什么命令来在程序编译时自动将foo.bmp添加到build子目录中?

2个回答

20

如果有所帮助,我尝试了另一种使用file命令的解决方案。其中有一个COPY选项可以简单地从源复制文件或目录到目标。

像这样:FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

对于目标,相对路径也可以工作(例如,您可以简单地使用“.”)。

文档参考:https://cmake.org/cmake/help/v3.0/command/file.html


谢谢!我也遇到了同样的问题,这正是我在寻找的。 - emankcin

15

为了实现这一点,您应该使用add_custom_command在构建目录中生成所需文件的构建规则。然后将依赖项从您的目标添加到这些文件:只有当目标需要时,CMake才会构建某些内容。

您还应确保仅在不从源目录构建时复制文件。

可以参考以下示例:

project(foo)

cmake_minimum_required(VERSION 2.8)

# we don't want to copy if we're building in the source dir
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)

    # list of files for which we add a copy rule
    set(data_SHADOW yourimg.png)

    foreach(item IN LISTS data_SHADOW)
        message(STATUS ${item})
        add_custom_command(
            OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}"
            COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}"
            DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}"
        )
    endforeach()
endif()

# files are only copied if a target depends on them
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png")

在这种情况下,我正在使用一个名为“ALL”的自定义目标,并依赖于yourimg.png文件来强制复制,但您也可以从现有目标之一添加依赖关系。

add_custom_target这一行是做什么的?我尝试修改您的代码,并为add_custom_target这一行包含了foreach循环,但在多个文件上失败了。 - Archit
是的,我猜你遇到了依赖问题……正如我所说,只有目标需要的文件才会被构建。因此,如果没有目标依赖于你的图像,它们就不会被构建。这就是为什么我在我的示例中添加了“add_custom_target”的原因。顺便说一句,更好的规则可能是 add_custom_target(data-target ALL DEPENDS ${data_SHADOW}) 这样它总是依赖于所有图像。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接