You need to enable JavaScript to run this app. 如何使用CMake将assets文件夹拷贝到macOS bundle应用的Resources目录
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CMake将assets文件夹拷贝到macOS bundle应用的Resources目录

解决方案

你原来的实现会丢失目录结构,是因为CMake的RESOURCE属性默认会将所有指定资源平铺放到bundle的Resources根目录下,不会保留原有的层级关系。可以用以下两种方案实现需求:

方案1:构建后直接拷贝整个assets目录(最简便)

直接通过构建后命令完整复制整个资源目录,完全保留原有文件结构,不需要单独遍历文件:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory
  ${CMAKE_SOURCE_DIR}/assets
  $<TARGET_BUNDLE_CONTENT_DIR:${PROJECT_NAME}>/Resources/assets
  COMMENT "Copying assets directory to bundle resources..."
)

其中$<TARGET_BUNDLE_CONTENT_DIR>是CMake内置的生成器表达式,会自动指向macOS bundle的Contents目录,不需要硬编码路径,兼容性更好。

方案2:遍历文件并保留相对路径(适合需要筛选资源的场景)

如果你需要排除部分不必要的文件、只拷贝指定后缀的资源,可以递归遍历后给每个文件单独指定bundle内的存放路径:

# 递归遍历assets目录下所有文件,可自行修改匹配规则筛选文件
file(GLOB_RECURSE ASSET_FILES "${CMAKE_SOURCE_DIR}/assets/*")

foreach(ASSET ${ASSET_FILES})
  # 计算当前文件相对于assets根目录的相对路径
  file(RELATIVE_PATH ASSET_RELATIVE_PATH ${CMAKE_SOURCE_DIR}/assets ${ASSET})
  # 提取相对路径中的目录部分,作为bundle内的存放路径
  get_filename_component(ASSET_RELATIVE_DIR ${ASSET_RELATIVE_PATH} DIRECTORY)
  # 给当前资源文件指定bundle内的存放位置,保留原有层级
  set_source_files_properties(${ASSET} PROPERTIES
    MACOSX_PACKAGE_LOCATION "Resources/assets/${ASSET_RELATIVE_DIR}"
  )
  # 将资源添加到目标中
  target_sources(${PROJECT_NAME} PRIVATE ${ASSET})
endforeach()

内容的提问来源于stack exchange,提问作者ellipticaldoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:39:00