21

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

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

4

2 回答 2

16

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

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

相对路径也适用于目的地(您可以简单地使用 . 例如)

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

于 2017-08-22T03:38:40.537 回答
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")

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

于 2013-06-10T09:36:33.547 回答