【问题标题】:Using CMake to copy .frameworks to iOS app bundle使用 CMake 将 .frameworks 复制到 iOS 应用程序包
【发布时间】:2016-06-08 03:57:17
【问题描述】:

我最近使用的一个库切换到分发为 .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 项目中,在“嵌入式​​二进制文件”部分,那么我很好(见下图)

所以我得出的结论是,问题在于将 .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?

【问题讨论】:

  • 我也有同样的问题。据我了解,FIXUP_BUNDLE 应该是理想的。但是,它看起来不像是为处理 iOS 包布局而构建的。
  • @EmilStyrke 已经在我的 TODO 列表上发布了一段时间的答案,你的痛苦促使我把它放在优先级上 :)

标签: ios xcode frameworks cmake


【解决方案1】:

我们最终没有找到理想的解决方案,并且最终以手动方式而不是首选:

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

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

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

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

【讨论】:

  • 谢谢!这与我最终所做的非常相似,但我还必须重新签署捆绑包本身,因为后续构建似乎跳过捆绑包签名但仍运行自定义命令。不确定这是 CMake 还是 XCode 的问题。
  • --sign 后面的 $2 是什么?
  • 您的签名 ID。
猜你喜欢
  • 2015-05-16
  • 2010-12-24
  • 1970-01-01
  • 2012-07-01
  • 2015-11-15
  • 2015-06-08
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多