将资源目录从源复制到CMake中的构建目录

Eth*_*gue 4 c++ assets cmake

我正在尝试用C++编写一个练习游戏.我正在使用CMake,我的项目由IDE自动构建在一个单独的构建目录中.但是,我的assets文件夹没有被复制到新目录.

目前,我正试图通过以下方式解决此问题:

add_custom_command(TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND cp -r ${PROJECT_SOURCE_DIR}/assets ${CMAKE_BINARY_DIR}
    )
Run Code Online (Sandbox Code Playgroud)

但是,这似乎对结果没有任何影响,我的构建目录中仍然没有 assets 目录.

我怎样才能将此资产目录复制到我的构建位置?有没有更聪明的方法将我的程序指向我的资产位置(也许还可以使用/ usr/share中的资产?)

tda*_*roy 18

我发现了两种方法,既确保它在目标构建上复制并保持最新,即使目标不需要重新构建。


第一个使用 CMake 命令行工具copy_directory。从文档中不清楚此复制是否总是发生,无论目录中的文件assets是否更新,或者是否仅在资产文件不存在或资产文件更新时进行复制:

add_custom_target(copy_assets
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_LIST_DIR}/assets ${CMAKE_CURRENT_BINARY_DIR}/assets
)
add_dependencies(mytarget copy_assets)
Run Code Online (Sandbox Code Playgroud)

第二个需要一个小的附加 CMake 脚本文件,但它允许我们使用file(COPY ...)CMake comamnd,该命令在文档中指出“复制会保留输入文件时间戳,并优化文件(如果文件存在于具有相同时间戳的目标处)”。

copy-assets.cmake首先,在与您的目录相同的目录中创建 CMake 脚本文件CMakeLists.txt,其内容为(类似于 Ethan McTague 的答案)

file(COPY ${CMAKE_CURRENT_LIST_DIR}/assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)

然后在您的 中CMakeLists.txt添加以下内容:

add_custom_target(copy_assets
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/copy-assets.cmake
)
add_dependencies(mytarget copy_assets)
Run Code Online (Sandbox Code Playgroud)


Eth*_*gue 7

经过一段时间的搜索,我设法找到了file(COPY {files} DESTINATION {directory})命令:

file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您修改文件,这将**不会**更新目标。您应该使用“add_custom_target”创建资产目标,并使用“add_dependency”使程序依赖于它。 (4认同)