Xcode 中编译源代码的目的是啥?

Posted

技术标签:

【中文标题】Xcode 中编译源代码的目的是啥?【英文标题】:What is the purpose of Compile Sources in Xcode?Xcode 中编译源代码的目的是什么? 【发布时间】:2013-06-19 18:03:59 【问题描述】: Xcode 中编译源代码的目的是什么? 您项目中的每个文件都需要在其中吗? 如果我将文件添加到项目中,是否 每个文件都被添加到编译源中。

【问题讨论】:

呃,如果你没有任何资源,你会编译什么? (提示:在左侧打开“导航器”时打开右侧的“资源管理器”窗格,查看与“源”中列出的文件对应的资源管理器设置。) 【参考方案1】:

你问

Xcode 中编译源代码的目的是什么?

目的是通知编译器在构建目标的过程中应该编译哪些源文件(例如 .m 文件)。

关于何时可以编辑“编译源”的几个实际示例:

    除了 Idles 在项目中包含或排除多个目标的源的示例之外,另一个可能从“编译源”中排除源的真实场景是当您使用第三方库(或一组classes) 提供源代码,但您想控制将在您的项目中编译哪些源代码。

    例如,如果使用 FMDB,您将源代码复制到您的项目中,但其中包含一个示例 fmdb.m 文件,该文件说明了如何使用 FMDB,但您不想将其编译为您的应用程序的一部分.您可以(甚至可能想要)从您的项目中完全删除fmdb.m,但您也可以只从编译源中删除该文件,这样您就有了一个很好的例子来说明如何使用这些类,但它不会被编译为项目的一部分。

    如果您使用SDWebImage 框架并将源代码包含在您的项目中,则另一个实际示例是。但是,您可能不需要 MKAnnotationView+WebCache 类别,在这种情况下,如果不使用地图和 MKAnnotationView 类,您可能希望将其从“编译源”中删除。如果您将其保留在您的项目中,如果您没有将您的项目与 MapKit.framework 链接,您可能会收到链接器警告。如果您不使用 MapKit,只需从编译源中删除 MKAnnotationView+WebCache 并解决链接 MapKit.framework 的需要(当您可能不需要它时)会更容易。

    您将使用“编译源”的另一种情况是,当您只想为某个特定源文件设置编译器标志时。例如,如果您有一个 ARC 项目,但您有一些非 ARC 代码。您可以进入“编译源”,选择非 ARC .m 文件,然后按照Transitioning to ARC Release Notes 中的说明设置-fno-objc-arc 标志。

    如果您曾经将文件添加到项目中,但不小心忽略了选择“添加到目标”选项,则在构建目标时不会编译这些源文件。但是您可以进入“编译源”并将这些源文件添加到要编译的文件列表中,然后它们将包含在您的目标的未来版本中。

你问:

您项目中的每个文件都需要在其中吗?

不,只是您要编译的每个源文件(例如 .m 文件)。不是标题。不是资产。只是你想要编译的源代码。

如果我将文件添加到项目中,是否每个文件都会添加到编译源?

如果您在添加文件时单击“添加到目标”复选框,.m 文件将被添加到“编译源”,资源将被添加到“复制捆绑资源”等。否则它们不会.

【讨论】:

【参考方案2】:

假设您的项目中有多个目标,并且您只需要每个目标中的一些代码,那么您将根据需要将内容删除/添加到编译源中。它基本上是在构建目标时将传递给编译器的源代码文件列表。

例如,我可能会设置一个目标,将我的代码的子集 A 构建到静态库中,然后设置另一个目标来构建子集 B,链接到另一个目标构建的库,并将第一个目标指定为目标依赖关系,这样如果我构建目标 B,Xcode 将首先构建目标 A。

【讨论】:

以上是关于Xcode 中编译源代码的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

源代码是啥格式?

在以下代码中添加内容:''的目的是啥?

Unity的工程导出Xcode编译卡死,Clang占爆内存,是啥原因呢?

加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案

stdio 是啥意思?

在 R 代码中使用“caret”包中的 preProcess 的目的是啥?