6

我正在尝试在我的 iPhone 应用程序中使用 PLDatabase 框架。我已将框架添加到我的 Xcode 项目中。但是,当我运行我的应用程序时,它会崩溃并出现以下错误:

dyld: Library not loaded: @loader_path/../Frameworks/PlausibleDatabase.framework/Versions/A/PlausibleDatabase
  Referenced from: /Users/todd/Library/Application Support/iPhone Simulator/User/Applications/BB3C66B2-A5BB-4329-B163-AB0072411AF1/Congress.app/Congress
  Reason: image not found

我不确定框架需要在磁盘上的确切位置才能找到。

谢谢

4

3 回答 3

10

iPhone 不支持嵌入式框架的动态链接。虽然您可能能够使模拟器正常工作,但它无法在设备上工作。如果要使用代码,则必须为框架构建静态库 (libpldatabase.a),然后将它们链接到应用程序。

Xcode GUI 没有为静态链接提供良好的界面,您需要在构建首选项中添加适当的标志(-lpldatabase -L/whatever/dir/it/is/in)。

于 2009-02-03T05:20:52.647 回答
8

iPhone 不支持动态链接实际上并不完全正确。真实情况是 App Store 安装的应用程序无法动态链接。

应用商店 / iTunes 将程序安装到 /private/var/mobile/... 目录中。任何打开的位于该子目录中的程序都会被 chroot,并且在打开时会剥夺某些权利。chroot 进程不能分叉,不能在后台运行,不能加载动态库,不能将文件保存到磁盘的小受保护区域之外(除了照片到照片目录)。

也就是说,iPhone 运行的是现代操作系统,它支持动态链接就好了。“越狱”的行为实际上是在 chroot 监狱之外安装一个程序,然后该程序可以执行诸如 fork 之类的操作,并将文件保存到磁盘上的其他位置并加载动态代码。

Apple(以及开放的 iPhone 社区)在手机上运行了大量程序(例如 MobilePhone、Mobile Safari 和 SpringBoard 应用程序),它们可以在后台运行并加载库。它们被放置在磁盘上的不同位置(通常是 /private/var/stash/Applications)。

所以...如果你想在应用商店中销售你的应用,你不能加载动态库。对于大多数人来说,这意味着您根本无法加载它。但是,如果您想通过 cydia(一种常见的越狱手机应用程序安装程序)分发您的应用程序,那么您可以越狱手机并加载您的动态库。事实上,由于 iTunes 安装过程是罪魁祸首,正如您所了解的,您甚至无法从您自己的应用程序中加载一个 dylib,然后将其写入您自己的手机……除非您越狱。

于 2009-02-21T09:45:20.670 回答
6

RE @mipadi:ZeroLink 在 Xcode 3.1 中被删除,iPhone SDK 不存在。正确答案是路易斯的;iPhone 不支持开发人员创建的应用程序中的动态加载框架。

Xcode 确实为静态库提供了良好的用户界面;只需将它们拖到项目中,它们就会被添加到链接阶段。无需对链接器标志大惊小怪。当您需要使用与这些静态库一起提供的标头时(然后您需要手动添加标头搜索路径)或当静态库与可用的 dylib 冲突时(此时您必须手动添加 -l 标志),问题就出现了.

于 2009-02-04T00:31:48.127 回答