2

我有一个项目,其中包含一个主要的 Cocoa 应用程序、一堆插件和几个辅助应用程序。辅助应用程序有自己的目标,因为我希望应用程序可以在没有插件的情况下构建,所以主应用程序有自己的目标(称为 AppTarget),但我通常将其全部构建在聚合目标中(称为 TargetA)。我还有另一个带有 TargetA 的聚合目标、另一个插件和一个附加的复制文件构建阶段 (TargetB)。这一切都按预期工作。我正在尝试创建一个新的聚合目标 TargetC,它包含 TargetA,并且将具有(但还没有)运行 Shell 脚本构建阶段。

我遇到的问题是我正在尝试使用 GCC_PREPROCESSOR_DEFINITIONS 来#define 一个符号 TARGETC,用于条件编译(#ifdef TARGETC ... #endif),但是当我查看时它没有包含在构建参数中在构建日志中,并且应用程序的行为与构建日志匹配 - GCC_PREPROCESSOR_DEFINITIONS 失败(我尝试了 TARGETC 和 TARGETC=1。我尝试添加 OTHER_CFLAGS 用户定义设置(将其设置为 -DTARGETC=1),但是那也没有用。

文档说聚合目标上的用户定义设置会渗透到它们的子目标,但似乎这只下降了一层——TargetA 可能会得到它,但 AppTarget 肯定不会。这是一个错误,预期的行为,还是我做错了什么?

4

1 回答 1

0

我找到了答案:这是预期的行为,此外,聚合目标根本不会将其用户设置传递给子目标;要么文档有误,要么我误读了它。这似乎违背了将 GCC_PREPROCESSOR_DEFINITIONS 作为可用于聚合目标的默认用户设置的目的,但是 c'est la vie。

为了获得我想要的行为,我正在构建一个单独的插件,该插件将添加到新的聚合目标中。我正在使用单例加载插件,它将保存对插件中主体类的引用(键入为id <MyPluginProtocol>),可以将其返回给任何询问的人。如果加载尝试失败(因为插件不存在),它将返回 nil,因此if (nil != [[PluginLoader sharedLoader] plugin])代替#ifdef TARGETC. 这意味着我不会减少运输代码的大小,但至少它可以工作,而且这不是浪费,因为无论如何我还有其他代码将进入插件(仅针对此目标)。

于 2011-05-28T00:24:45.120 回答