理解Xcode的复制头文件阶段

27
在Xcode的“复制头文件”阶段中,“Project”部分和“Private”部分下的头文件有什么区别?在什么情况下使用它们?
此外,我可以理解为什么要复制公共头文件(例如静态库),但为什么要复制私有头文件?
编辑:@mipadi 在下面解释了Public和Private部分的作用。然而,我仍然不明白将头文件包含在“Project”部分与不在“Copy Headers”阶段的任何部分中之间的区别。
4个回答

17
如果一个公共标头包含私有标头,那么您必须复制私有标头,但是您需要确保库或框架的使用者知道那些私有标头不属于公共 API 的一部分。
"Project" 标头是私有标头,不会被公共标头包含(它们通常是内部实现的一部分,因此只包含在实现文件 .c 或 .m 中)。
构建框架时,公共标头将被复制到框架的 Headers 目录中,而私有标头则被复制到 PrivateHeaders 目录中。

1
非常感谢!不过我不明白在“复制头文件”阶段的“项目”部分包含头文件和完全不包含头文件的区别是什么。 - Danra
1
@Danra:当标题可见性设置为“project”时,它将在编译库或框架时使用,但不作为最终产品的一部分(即仅用于内部实现)。 - mipadi
1
如果头文件根本不在阶段中,它也将可用。导入它仍然可以工作。据我所知,“复制头文件”阶段是一种在链接阶段之后发生的后构建事件。顺便说一下,当向项目添加扩展/协议时,通常默认情况下Xcode不会将适当的.h文件添加到任何目标中,并且它不会出现在“复制头文件”阶段中。 - Danra
此外,如果这是为了测试目标,将它们放置在项目部分(在测试目标内)就足够了,如果只有一个相关联的目标。 - C. Bess

6

如果你将头文件放在“项目”下面,那么无论实际的头文件位置在哪里,这些头文件都会对你的实现可见。

假设你的文件夹结构如下: /Sources/libAF/AFSomething.h /Sources/libAF/AFSomething.m /Sources/exec/main.m

如果你把“AFSomething.h”放在“项目”下,你可以像这样在main.m中使用它: #import "AFSomething.h"

通俗易懂地说,Xcode会在你省略实际路径信息的情况下包含项目头文件。


0

只是补充一下,通常人们会有一个脚本来“清洁”私有标头,这样公共代码就无法看到符号是什么。对于调试/开发目的,请保留私有标头,在开发和调试阶段非常有用。


0

来自设置头文件的可见性:

  • 公开:接口已经最终确定,旨在供产品客户使用。公共头文件以可读源代码形式无限制地包含在产品中。

  • 私有:接口不适用于你的客户或处于早期开发阶段。私有头文件包含在产品中,但标记为“私有”。因此,所有客户都可以看到符号,但客户应理解他们不应该使用它们。

  • 项目:接口仅供当前项目中的实现文件使用。项目头文件不包含在目标中,除非是对象代码。符号对客户完全不可见,只对你可见。


6
我仍然不清楚在“项目”部分包含标题和在“复制标头”阶段没有任何标题之间的区别。 - Danra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接