如何在iPhone项目中添加第三方框架?

时间:2009-02-03 04:05:10

标签: iphone cocoa xcode dyld

我正在尝试在我的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

我不确定框架需要驻留在磁盘上的确切位置。

由于

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:8)

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

app store / ituned将程序安装到/ private / var / mobile / ...目录中。生活在该子目录中的任何程序都是chrooted,并且在打开时会剥离某些权限。 chrooted进程不能fork,它们无法在后台运行,它们无法加载动态库,也无法将文件保存在磁盘的小保护区域之外(照片到照片目录除外) )。

也就是说,iPhone运行的现代操作系统支持动态链接。 “jailbreaking”的行为实际上是在chroot jail外部安装一个程序,然后可以执行fork和将文件保存到磁盘上的其他位置并加载动态代码。

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

所以......如果您想在应用商店中销售您的应用,则无法加载动态库。对大多数人来说意味着你根本无法加载它。但是如果你想通过cydia(一个常见的越狱手机应用程序安装程序)分发你的应用程序,那么你可以通过越狱手机和加载你的动态图书馆来逃脱。事实上,由于itunes安装过程是罪魁祸首,正如你所了解的那样,你甚至无法从你自己的应用程序中加载一个dylib,你写给自己的手机......除非你越狱。

答案 2 :(得分:6)

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

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