在iOS c++/Qt应用程序中,我需要运送一些文件并将它们保存在目录结构中。
对于Android版本,我们捆绑了一个zip,在创建QApplication之前,我们将其解压缩到目标上。
在iOS上,CMake似乎无法将文件绑定到树中:https://cmake.org/cmake/help/latest/prop_tgt/RESOURCE.html#prop_tgt:RESOURCEhttps://cmake.org/cmake/help/latest/prop_sf/MACOSX_PACKAGE_LOCATION.html
我不确定这是cmake的限制,还是iOS的全球限制。来自有关iOS捆绑包的文档:
它使用了一个相对平坦的结构,几乎没有多余的目录,以节省磁盘空间并简化对文件的访问。
首选的方法是什么?
- 是否有直接从CMake运送文件的解决方案
- 如果没有,我如何实现这一点,以便在创建QApplication之前可以使用它们
xcode命令
多亏了@Cy-4AH,我在Xcode中添加了文件夹,并可以获得这样做的命令:
CpResource _PATH_TO_DIRECTORY_ _APP_BUNDLE_DIRECTORY_/_RESOURCE_DIR_NAME_
cd /Users/denis/opt/qfield/ios/QField
export PATH="....."
builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -strip-debug-symbols -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -resolve-src-symlinks _PATH_TO_DIRECTORY_ _APP_BUNDLE_DIRECTORY_
但是我如何从cmake创建这个?builtin-copy
是一个xcode命令。
简单的系统复制命令
根据2008年的一次旧讨论,我们可以使用简单的cp
命令。这一直到签名,但随后我得到一个错误unsealed contents present in the bundle root
。
从这个答案来看,我似乎无法简单地在资源目录中添加文件夹。从文档解剖框架束:Nonlocalized resources reside at the top level of the Resources directory
(免责声明:我不是CMake用户,可能有更CMake-ey的方法可以做到这一点(
如果您可以设置构建后操作,那么以下终端脚本可以有效地将文件从另一个位置同步到您的捆绑包中。我在游戏引擎中使用它,因为它只在后续构建时复制更新或新文件,并保留目录结构:
mkdir -p PATHTO/ORIGINFOLDERNAME
mkdir -p PATHTOBUILDFOLDER/PROJECTNAME.app/Contents/Resources/DESTINATIONFOLDERNAME
rsync -avu --delete --exclude=".*" PATHTO/ORIGINFOLDERNAME/ PATHTOBUILDFOLDER/PROJECTNAME.app/Contents/Resources/DESTINATIONFOLDERNAME
mkdir
命令仅用于确保在删除文件夹时生成这些文件夹。
显然CMake方法也适用于目录。
target_sources(${QT_IOS_TARGET} PRIVATE ${_resource})
set_source_files_properties(${_resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
它将只添加在捆绑包的根目录中,而不是Resources
中。
如果嵌入的文件不是太大,您可以考虑:
-
,生成一个C++文件,将该文件嵌入为常量数组。例如,如果您的文件只包含一行新行的
hello, world
,那么您可以使用类似的内容/// file contents.cc const char file_contents[] = "hello, worldn";
并在程序开始时(可能在main
函数中,在QApplication
之前(调用一个C++函数,该函数会写入这样的文件(也许在/tmp/
中(。
- 在您的构建自动化中(例如,您的
Makefile
或qmake东西(,有一些东西从真正的源代码生成C++contents.cc
文件
这是从POSIX/Linux的角度来看的,将我的答案适应您的iOS。