Xcode:在另一个项目使用的一个项目中定义预处理器宏

时间:2013-11-10 16:59:19

标签: objective-c xcode macros c-preprocessor conditional-compilation

我有多个应用程序项目都链接到同一个静态库项目。每个应用程序项目都需要使用不同的设置编译静态库项目。

目前我在静态库项目中有一个条件编译头,让我们称之为ViewType.h,它会为每个视图添加更多类型,typedef,宏等。

#define VIEW_A 1
#define VIEW_B 2
#define VIEW_C 3

#ifndef VIEWTYPE
#define VIEWTYPE VIEW_A
#endif

#if VIEWTYPE == VIEW_A
    // further typedefs and defines tailored to VIEW_A
#elif VIEWTYPE == VIEW_B
    // further typedefs and defines tailored to VIEW_B
#elif VIEWTYPE == VIEW_C
    // further typedefs and defines tailored to VIEW_C
#endif

这里的问题是每个应用程序项目都需要更改静态库项目中的VIEWTYPE,每次切换应用程序项目时我都要再次更改VIEWTYPE。

不幸的是,似乎我无法在应用目标中将VIEWTYPE = 2(例如)定义为预处理器宏。我无法在静态库项目中定义它,因为所有3个项目都包含相同的静态库项目,因为.xcodeproj在3个应用程序之间共享(即.xcodeproj被拖放到应用程序项目中;我'我没有使用工作区。)

我理解一个问题是静态库是一个依赖目标,它是在应用目标被考虑之前首先构建的。所以也许有一些方法可以根据其他条件(即检查文件或包含可选的特定于应用程序的标头)来决定构建库的应用程序。

问题:如何根据应用目标定义的宏/设置创建宏或以其他方式执行条件编译,然后由静态库项目遵守?

1 个答案:

答案 0 :(得分:1)

第一种最简单的方法是摆脱静态库,只是将源文件直接包含在依赖项目中。我经常发现中间静态库比它们的价值要麻烦得多。当它们提供显着的构建性能改进时,它们的一大好处就来了,但是它们不能在这里,因为无论如何你都在为每个最终目标重建静态库。

我会说使用#defines类型几乎总是让我哭泣,并且可能暗示一个可以更好地处理的设计缺陷。例如,您可能希望实现返回所需类的方法(UIView layerClass的方式)。更改类型定义的预处理器技巧可能会导致极其微妙的错误。 (我刚刚追查了去年的一个案例......这是一次可怕的,可怕的崩溃。)

也就是说,使用xcconfig文件可以解决此问题的某些版本的另一种方法。例如,如果实际存在静态库的多个副本(即,这是通常复制到其他项目中的库),则可以使用具有#include "../SpecialTypeDefs.xcconfig"的xcconfig文件。该文件将由每个项目提供以设置特殊声明。未能定义该文件将导致编译器错误,因此很容易没有错误。

但就个人而言,我只是直接将文件包含到实际项目中,并跳过库,除非它们非常庞大。