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

标签 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. 我们添加了一个在构建完成后但在打包之前运行的自定义命令(请参阅 CMake 的 add_custom_command)。

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

    • 在我们的 app bundle 文件夹下创建一个 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")

关于ios - 使用 CMake 将 .frameworks 复制到 iOS 应用程序包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37692973/

相关文章:

ios - 图像背景中的 UICollectionview 为透明,而不在 Swift 中使其中的单元格透明

ios - 多个 UIScrollView

ios - 你如何创建一个 Cartfile?或者轻松地将框架添加到您的应用程序?

ios - 如何在方法中使用 __weak 来防止 iOS 中的内存泄漏

ios - Swift:如果 PFObject = nil 则执行 segue。

ios Responder chain - View 如何捕获事件?

ios - 在 iOS9 上的 facebook sdk 4.6 中发送到 facebook 登录管理器实例的无法识别的选择器

xcode - 为什么我在 Yosemite 上的 Xcode 6 中收到错误 "Command/usr/bin/codesign failed with exit code 1"?

node.js - 适用于 RESTful api 的最佳 node.js + postgresql web 后端框架?

c++ - Qt mac 版本缺少框架