4

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

目前我在静态库项目中有一个条件编译头文件,我们称之为 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

这里的问题是,每个app项目都需要更改静态库项目中的VIEWTYPE,而每次切换app项目都必须再次更改VIEWTYPE。

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

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

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

4

1 回答 1

1

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

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

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

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

于 2013-11-10T20:54:04.150 回答