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

Ios 静态库中.h文件的意义是什么?,ios,macos,static-libraries,Ios,Macos,Static Libraries,我是一个新的iOS开发者。我有一个基本的疑问。我在很多地方读到,我们需要将.h文件与静态库的.a文件一起发送 和.a文件是编译的库,具有整个实现,开发人员自己无法读取,只是为了保护实现者代码 我们需要.h文件来了解哪些公共函数可用。但是为什么Xcode不能解码一个文件并直接使用它,而不是发送另一个.h文件呢。Xcode不需要向开发人员显示.a实现,而是可以建议开发人员使用公开可用的方法 我看不出苹果没有这样做的任何逻辑原因。我确信,运送.h文件肯定有充分的理由。我想知道原因是什么?一个。一个文件

我是一个新的iOS开发者。我有一个基本的疑问。我在很多地方读到,我们需要将.h文件与静态库的.a文件一起发送

和.a文件是编译的库,具有整个实现,开发人员自己无法读取,只是为了保护实现者代码

我们需要.h文件来了解哪些公共函数可用。但是为什么Xcode不能解码一个文件并直接使用它,而不是发送另一个.h文件呢。Xcode不需要向开发人员显示.a实现,而是可以建议开发人员使用公开可用的方法


我看不出苹果没有这样做的任何逻辑原因。我确信,运送.h文件肯定有充分的理由。我想知道原因是什么?

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

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

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

最后但并非最不重要的一点是,并不是苹果公司决定这样做,
.a
.o
文件可以在(至少)任何类似Unix的操作系统上找到,头文件从第一天起就是C语言中的标准文件


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

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

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

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

最后但并非最不重要的一点是,并不是苹果公司决定这样做,
.a
.o
文件可以在(至少)任何类似Unix的操作系统上找到,头文件从第一天起就是C语言中的标准文件


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

.a
文件是编译后的
.c
.c++
.m
等文件的集合。反编译这些文件只是为了获得函数的名称/签名a)基于道德/隐私的理由是不可靠的,b)需要大量的工作。
.a
文件不是字节码或类似的易于反向工程的东西——它们是机器码


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

.a
文件是编译的
.c
.c++
.m
等文件的集合。反编译这些文件只是为了获得函数的名称/签名a)基于道德/隐私的理由是不可靠的,b)需要大量的工作。
.a
文件不是字节码或类似的易于反向工程的东西——它们是机器码


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

感谢您的详细回复。但由于.a代码是特定于体系结构的,为什么编辑器不能读取.a文件,并向我们显示可用的公共函数,就像在执行期间一样,可执行文件能够链接静态库中所需的函数。那么为什么编辑不能这样做呢。这只是为了我的逻辑理解。从
.o
文件中读取函数名非常简单(从
.a
文件中读取函数名也非常简单),但是:您无法轻松知道函数的参数数量、类型和返回值!ABI(应用程序二进制接口)定义了如何处理参数,通常它们只是一个接一个地推送到堆栈上。
.o
文件中的机器代码随后从那里加载数据。但这不可能总是逆向工程。谢谢你的详细回复。但仍然是。代码是归档的