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

时间:2016-06-08 03:57:17

标签: ios xcode frameworks cmake

我最近使用的图书馆作为.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

从Xcode安装时。如果我手动将它添加到我的xcode项目中,在"嵌入式二进制文件"然后我很好(见下图)

enter image description here

所以我得出结论,问题是将.framework放入我的应用包中。我遇到了this question并查看了链接的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)

这是特定于OSX还是我可以像iOS一样应用它吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

  4. set_target_properties(${EXE_NAME} PROPERTIES 
            XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks")