使用CMake将.frameworks复制到iOS应用程序包

Joh*_*ter 11 xcode frameworks cmake ios

我最近使用的库转换为.framework分发.

在我现有的CMake文件中,我已成功将其与我的iOS应用程序链接,但我得到:

dyld: Library not loaded: @rpath/Pizza.framework/Pizza
  Referenced from: /var/mobile/Containers/Bundle/Application/D71ED298-C287-4B2F-8AFA-710A14C06D75/pizzashop.app/pizza
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

当我从Xcode安装它.如果我手动将它添加到我的xcode项目,在"嵌入式​​二进制文件"部分,那么我很好(见下图)

在此输入图像描述

所以我得出结论,问题是将.framework放入我的应用程序包中.我已经遇到过这个问题并查看了链接的QT示例,但我仍然试图在这里定位自己,因为我发现语法有点不透明.

CMake的BundleUtilities是我想在这里使用的吗?在查看BundleUtilities示例时,我有点迷失:

set(APPS ...)  # paths to executables
set(DIRS ...)   # directories to search for prerequisites
INSTALL(CODE "
   include(BundleUtilities)
   fixup_bundle(\"${APPS}\"   \"\"   \"${DIRS}\")
   " COMPONENT Runtime)
Run Code Online (Sandbox Code Playgroud)

这是OSX特定的,还是可以像iOS一样应用它?

Joh*_*ter 5

我们最终没有找到理想的解决方案,并且最终比首选的手动操作更多:

  1. 我们添加了一个自定义命令,我们在构建完成后、但在打包之前运行(请参阅 CMake 的add_custom_command)。

  2. 自定义命令执行以下操作:

    • 在我们的应用程序包文件夹下创建一个 Frameworks 目录(确保它位于打包过程中将被复制的位置)。
    • 我们cp -aH用来将所有框架复制到这个 Frameworks 目录中
    • 然后我们使用以下命令重新签署此目录中的每个框架: codesign --force --verbose Computers.framework --sign "$2"
  3. 将 Frameworks 目录添加到您的搜索路径:

set_target_properties(${EXE_NAME} PROPERTIES 
        XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks")
Run Code Online (Sandbox Code Playgroud)