如何使用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
相关产品推荐
相关产品推荐

