.h文件在静态库中的意义是什么?

时间:2012-01-17 14:12:02

标签: ios macos static-libraries

我是一名新的iOS开发人员。我有一个非常基本的怀疑。我在许多地方读过,我们需要发送.h文件以及静态库的.a文件。

而.a文件是编译库,具有完整的实现,开发人员无法自行阅读,只是为了安全保护实现者代码。

我们需要.h文件才能知道哪些公共功能可用。但是为什么Xcode不能解码.a文件并直接使用它而不是发送另一个.h文件。 Xcode不需要向开发人员展示.a实现,而是可以向开发人员提供公开可用的方法。

我没有看到苹果没有这样做的任何合乎逻辑的理由。我相信运送.h文件肯定有充分理由。我想知道可能是什么原因?

2 个答案:

答案 0 :(得分:5)

.a文件只是一个或多个.o(对象)文件的存档。目标文件包含已编译的机器代码(针对特定CPU体系结构下的一个特定操作系统)。原始源代码是"丢失"。

您可能不知道的事实:目标文件可以包含从任意编程语言编译的二进制文件。 .h文件是特定于C / C ++ / Objective C的。它包含您需要能够在C / C ++ / Objective C中的目标文件中使用二进制形式的函数/数据类型/ ...所需的数据类型和函数原型。编写一个Pascal库,将其编译为.a文件,并使用适当的头文件(.h)在Objective C程序中使用该代码。

您也可以只有一个头文件(.h文件),但例如6个不同的.a个文件:一个为Mac OS X 64bit编译,一个用于Mac OS X 32bit,一个用于Linux 2.6 64bit,一个用于Linux 2.6 32bit,一个用于FreeBSDOpenBSD的最后一个。

最后但并非最不重要的是,Apple决定采用这种方式,.a.o文件可以在(至少)任何类Unix操作系统上找到从头几天开始,头文件就是C中的标准。

通常,如果您将库从Mac移植到Linux,您可以使用(大部分)代码和头文件,但必须编译一个单独的.a文件,其中包含为Linux编译的目标文件。

答案 1 :(得分:0)

.a个文件是已编译的.c.c++.m等文件的集合。为了获得功能的名称/签名而对这些文件进行分解会a)在道德/隐私方面变得狡猾,并且b)需要做很多工作。 .a文件不是字节代码或类似的易于逆向工程的东西 - 它们是机器代码。

即使您对这些编译文件中的“源”进行了反向工程,它们也不会包含实际的方法名称,签名或任何可识别的内容。