我对 xcode 和 Objective-c 还很陌生。我想问一个非常基本的问题。
我发现在项目设置中“将二进制文件链接到库”时,框架和库之间存在差异,它们是从工作区中的其他项目导入的。
第一个问题,为什么有一个框架? 为什么有一个库? 我的库不能是一个框架吗?
然后,从 。 h文件中,如何从导入的静态库调用类?
我想一定有个前缀,但我找不到。 ProjName/Myclass.h 都不能工作。
请尽量说得具体一点。
谢谢
基本上,框架就是库,并提供了使用它们的便捷机制。如果你看“内部”一个框架,它只是一个目录包含一个静态库和头文件(在一些文件夹结构与元数据)。
如果您想创建自己的框架,那么您必须创建一个“静态库”并以特定的方式打包它。见 这个问题
一般来说,平台上的框架用于可重用的行为,您可以在“现有框架”中添加自己的代码。如果你想拥有一些特定的功能,你可以使用一个库(例如 three-20)和 把它打包到你的应用程序中
与静态库相比,框架的最大优势在于,它们可以简洁地打包编译后的库二进制文件和任何相关头文件。它们可以放到您的项目中(就像 SDK 的内置框架,如 Foundation 和 UIKit 一样) ,并且它们应该能够正常工作(大多数时候)。
大多数框架都包含动态库,在 Xcode 使用 Mac 框架模板创建的框架将创建一个动态库。IPhone 不支持动态框架,这就是为什么 iOS 代码的可重用库通常以静态库的形式发布的原因。
静态库很好,但是它们需要用户做一些额外的工作。您需要将项目链接到库,并且需要将头文件复制到项目 或者中,通过在构建设置中设置适当的头搜索路径来引用它们。
所以: 总而言之,我的观点是,分发库的最佳方式是作为一个框架。要为 iOS 创建一个“静态”框架,基本上可以使用一个普通框架,并用编译后的静态库替换二进制文件。这就是我如何分发我的图书馆之一 瑞斯蒂,也是我打算在未来如何分发我的图书馆。
您可能希望查看该项目中提供的 Rakefile (如果您不知道,Rake 是 Ruby 的 Make 等价物)。我有一些任务来编译我的项目(使用 xcodebuild)并将它们打包成 iOS 的静态框架。你会发现这很有用。
xcodebuild
或者,您可能希望使用 这些 Xcode 4模板来创建一个 iOS 框架。
更新2013年12月9日 : 这是一个受欢迎的答案,所以我想我应该编辑一下,说我对图书馆发行版的第一选择已经改变了。作为消费者或生产者,我对任何第三方库的第一选择是 CocoaPods。我使用 CocoaPods 发布我的库,并提供一个预编译的静态库,其中头部是备用选项。
作为一个开发人员,您可以创建库或框架,因此您可以同时使用它们。框架内包含库和资源
[图书馆,框架... ]
然后,从.h 文件中,我如何从导入的静态库中调用类?
您能够使用库,只是要确保您使用正确的 Library Search paths和 Header Search Paths到 .modulemap和 umbrella.h
Library Search paths
Header Search Paths
.modulemap
umbrella.h
[ Objective-C Consumer-> Objective-C 静态库]