2

我在 iOS 中看到了一些静态库项目。我看到了两种不同类型的链接静态库。

a) 仅将 .a 静态库添加到新的 xcode 项目及其头文件中。这意味着通用静态库。

b) 将 .a 静态库添加到新的 xcode 项目并添加创建静态库的 xcode 项目。这称为跨项目引用?示例:将 cocos2d 添加到 xcode 3.2

当我从第二个项目中删除通过其创建静态库的 xcode 项目时,它给出了错误。我尝试了第二个的第一种方法。但它不起作用。

1)你能解释一下为什么它不同吗?它会因我们使用的 xcode 版本而有所不同吗?是旧xcode版本的第二种方法吗?

2)最近的xcode版本(如xcode 4.3)是否支持跨项目引用?如果支持,哪个是更好的方法?这两种方法有什么区别?

4

1 回答 1

3

我先大致解释一下什么是.a文件和框架。在 Cocoa 中,您将类写入 .m 文件,或多或少地写入每个文件的类。当您编译您的项目时,编译器会一一处理您的每个 .m 文件,并生成源代码的二进制表示(机器代码)以及一些标头信息,例如对象方法的列表和偏移量。结果是每个 .m 源代码文件都有一个 .o 目标文件。现在,如果您要链接静态库,则所有这些目标文件都打包到给定平台的 .a 存档文件中:i386 用于模拟器,armv7 和 armv7s 用于设备。要使用这些档案,您还需要公开 SDK 的头文件(即使可以从档案中提取相同的信息)。一个 .framework 包是简单的一组这些。要支持的每个架构的文件,加上公共头文件,可以说很好地打包到一个单独的包中。由于链接是“静态的”,因此在链接最终可执行文件时,将从 .a 文件中提取 .o 文件并复制到最终可执行文件的二进制文件中。

一些静态库提供商不希望向第三方开发人员透露其库的源代码,因此只发布 .a 二进制文件。此类库的示例是 Facebook 或 Aviary SDK。当您将 .a 文件添加到您的项目时,您实际上是在添加已编译对象的二进制表示。由于您还可以访问标头,因此即使您无法访问源代码,您仍然可以使用这些二进制文件。

当您使用嵌入式项目时,您可以访问库的源代码。在这种情况下,XCode 将首先编译您的嵌入式项目,再次从原始 .m 源代码文件生成 .o 和 .a 文件。然后它开始编译你的应用程序,该应用程序声明它对库的 .a 文件的依赖关系,这一次很容易获得,因为它是在几秒钟前由 XCode 编译的。所以链接成功。另一方面,当您删除嵌入式项目时,它不仅会删除源代码文件,还会删除生成的 .a 文件,因此最终应用程序的链接将失败。

从最终二进制文件的角度可以看出,无论您使用预编译的 .a 文件还是嵌入式项目,都没有区别,相同的 .o 文件最终会出现在您的最终二进制文件中,只是在第一种情况下它们是由库的提供者编译,在第二种情况下由您编译。即使您可以访问源代码,使用 .a 文件的唯一优点是编译时间更快。缺点是调试器需要额外的配置才能进入库的源代码。

无论如何,如果您想删除嵌入式项目,您可以这样做。将该库编译为静态库一次,然后在目标目录中搜索生成的 .a 文件。将每个架构的 .a 文件复制到应用程序的项目文件夹中,并将它们与公共头文件一起添加到项目中,然后编译您的最终应用程序。

于 2013-07-03T08:43:46.017 回答