Xcode4中框架和静态库的区别,以及如何调用它们。

137

我对xcode和objective-c非常新手,想要问一个非常基础的问题。

我发现在项目设置中,“链接二进制文件到库”时,框架和库以及从工作区导入的库之间存在差异。

首先,为什么需要框架?为什么需要库?我的库不能是框架吗?

其次,在从我的导入的静态库的.h文件中,如何调用类?

我认为必须要有一个前缀,但我找不到它。 既不是“ProjName/Myclass.h”,也不是“”。

请尽可能具体地回答。

谢谢


不是基础问题 - Masih
3个回答

142
框架与静态库相比最大的优势在于,它们作为一种整洁的方式来打包编译后的库二进制文件和任何相关的头文件。它们可以像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构建了一个框架,是否会有影响?因为Distribution的占用空间更小。 - Aldrich Co
3
是的,我做过一些工作,帮助客户使用 CocoaPods 开放他们的私有 SDK。关键是要拥有一个包含编译后的静态库、头文件和 podspec 的公共仓库,并指向此处,另外还需要一个包含源代码的私有仓库。理想情况下,您应该有某种 CI/自动化流程来检出您的私有仓库,编译和更新您的公共仓库,保持两个仓库同步。使用标签在公共仓库中标记实际版本发布(可能也需要在私有仓库中这样做,以便您知道用于创建公共发布的源代码提交)。 - Luke Redpath
1
@LukeRedpath,你的CI解决方案听起来非常理想... 你知道有没有一些好的文章/博客教程,介绍如何设置它?最好是包含Jenkins的。 - micromanc3r
显示剩余2条评论

19

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

如果你想创建自己的框架,你必须创建一个“静态库”并以特定的方式打包它。请参见这个问题

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


1
请注意,框架不一定必须包含静态库。实际上,在Mac OS X上,大多数框架都不包含静态库,而是包含动态库。 - user557219
谢谢,很清楚。但是我怎么在.m文件中调用静态库中的一个类呢?除了添加"链接二进制文件和库"之外,是否只需调用#import "MyClass.h"就可以了? - Leonardo
@Bavarious 你说得对,我应该只写“库”^^;但几乎没有一个框架是没有库的 - 在大多数情况下,你链接一个框架进行编译,而库则存在于目标系统上。这又涉及到行为与功能之间的问题。 - Martin Ullrich
@Leonardo 是的,基本上这就是你要做的。只需确保.h文件在你的路径中某个地方即可。如果你有库的XCode项目,你可以将该项目及其目标作为依赖项包含进来,这样你就可以获得更多的调试功能和.h文件在你的路径中了。 - Martin Ullrich
我很困惑,我认为你的答案是正确的,但是我看到它被标记为“-1”?!?!其次,该库是工作区的一部分,并且已从主项目中正确链接。但是在构建应用程序时,在'#import "MyClass.h"'行处仍然出现“找不到类”的错误。我知道有一个技巧可以解决这个问题。 - Leonardo

0
第一个问题,为什么会有框架?为什么会有库?我的库不能成为框架吗?
作为开发者,您可以创建库或框架,因此您可以使用它们两个。框架包含库和资源。 [Library, Framework...]
然后,从.h文件中,如何调用我导入的静态库中的类?
您可以使用库,只需确保使用正确的库搜索路径头文件搜索路径.modulemapumbrella.h [Objective-C consumer -> Objective-C static library]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接