gpt4 book ai didi

iphone - 新版本的 xcode 是否支持跨项目引用以添加用于链接的静态库?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:09:41 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于iphone - 新版本的 xcode 是否支持跨项目引用以添加用于链接的静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com