xcode4中框架和静态库之间的区别以及如何调用它们


133

我对xcode和Objective-c还是很陌生。我想问一个非常基本的问题。

我看到在项目设置中“将二进制文件链接到库”时,从工作空间中其他项目导入的框架和库存在差异。

第一个问题,为什么要有一个框架?为什么有图书馆?我的图书馆不能成为框架吗?

然后,从.h文件中,如何从导入的静态库中调用类?

我想必须有一个前缀,但是找不到。也不“ ProjName / Myclass.h”正在工作。

请,请尽可能具体。

谢谢


这不是一个基本问题
Masih

Answers:


140

与静态库相比,框架的最大优点是它们可以很好地打包已编译的库二进制文件和任何相关的标头。它们可以放入您的项目中(就像SDK的内置框架,如Foundation和UIKit一样),它们应该可以正常工作(大多数时间)。

大多数框架都包含动态库。使用Mac Framework模板在Xcode中创建的框架将创建一个动态库。iPhone不支持动态框架,这就是为什么将iOS代码的可重用库分发为静态库的原因。

静态库很好,但是用户需要一些额外的工作。您需要将项目链接到库,并且需要将头文件复制到您的项目中,或者通过在构建设置中设置适当的头搜索路径来引用它们。

所以:总而言之,我认为分发库的最佳方法是作为框架。要为iOS创建一个“静态”框架,您基本上可以采用一个普通框架并将二进制文件替换为已编译的静态库。这就是我分发我的一个库Resty的方式,也是将来打算分发我的库的方式。

您可能需要查看该项目中提供的Rakefile(以防万一,您不知道Rake是Ruby的Make的等同物)。我有一些任务来编译我的项目(使用xcodebuild)并将其打包为iOS的静态框架。您应该发现这很有用。

另外,您可能希望使用这些Xcode 4模板来创建iOS框架。

2013年12月9日更新:这是一个很受欢迎的答案,因此我想我要说的是,我分配图书馆的第一选择已经改变。对于任何第三方库,无论是作为消费者还是生产者,我的首选都是CocoaPods。我使用CocoaPods分发我的库,并提供一个预编译的静态库,其中包含标头作为备用选项。


1
因此,库可以是静态的也可以是动态的,而框架只是一组库,也可以是动态的或静态的,这是正确的理解吗?
Tony

似乎Xcode框架目标还允许您复制标头,但不能捆绑资源。分布式静态库也可以包含头吗?
Tony

后续问题:是否使用Debug或Distribution构建框架是否重要?因为否则分发将具有较小的占用空间。
Aldrich Co

2
@GoRoS是的,我愿意;实际上,我只是为一个客户做了一些工作,使他们可以使用CocoaPods提供其私有SDK。诀窍是要有一个带有已编译的静态库的公共仓库,头文件和podspec指向此文件,并带有一个源的私有仓库。理想情况下,您将具有某种CI /自动化功能,以检出您的私有存储库,编译和更新您的公共存储库,并使两者保持同步。使用标记在公共存储库中标记实际的版本发布(也可能在私有存储库中标记,以便您知道用于创建公共发行版的源提交)。
路加·雷德帕特

1
@LukeRedpath您的CI解决方案听起来非常理想...您是否知道一些不错的文章/博客以及一些如何设置它的教程?理想地与詹金斯(Jenkins)
micromanc3r

19

基本上,框架是ARE库,并提供了使用它们的便捷机制。如果在框架内部“看”,它只是一个包含静态库和头文件的目录(在带有元数据的某些文件夹结构中)。

如果要创建自己的框架,则必须创建“静态库”并以特定方式打包。看到这个问题

通常,平台上的framworks用于可重复使用的行为,您可以在其中将自己的代码“添加到现有框架”中。如果您要具有某些特定功能,则可能需要使用一个库(例如three20)并将其打包到您可分发的应用程序中


1
注意,不要求框架必须包含静态库。实际上,在Mac OS X上,大多数框架都不包含静态库-而是包含动态库。

谢谢,很明显,但是如何从.m文件中调用静态库中的类呢?除了添加“带有库的链接二进制文件”之外,调用#import“ MyClass.h”是否足够?
莱昂纳多·

@Bavarious你是对的,我应该只写“库” ^^; 仍然有几乎没有库的框架-在大多数情况下,您链接到要编译的框架,并且库位于目标系统上。这又是行为与功能的关系
Martin Ullrich,

@Leonardo是的,基本上这就是您要做的。只要确保.h文件位于您的路径中。如果您具有libaray的XCode项目,则可以将该项目及其目标作为依赖项包括在内,以便在路径中获得更多调试功能和.h文件
Martin Ullrich

我很困惑,我想告诉你答案是正确的,但是我看到它标记为“ -1”?!?!?!其次,该库是工作空间的一部分,并与主项目正确链接。但是在构建应用程序时,在行'#import“ MyClass.h”'上仍然出现“找不到类”。我知道有一个使它起作用的技巧。
莱昂纳多·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.