我有多个应用程序项目都链接到同一个静态库项目。每个应用程序项目都需要使用不同的设置编译静态库项目。
目前我在静态库项目中有一个条件编译头,让我们称之为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被拖放到应用程序项目中;我'我没有使用工作区。)
我理解一个问题是静态库是一个依赖目标,它是在应用目标被考虑之前首先构建的。所以也许有一些方法可以根据其他条件(即检查文件或包含可选的特定于应用程序的标头)来决定构建库的应用程序。
问题:如何根据应用目标定义的宏/设置创建宏或以其他方式执行条件编译,然后由静态库项目遵守?
答案 0 :(得分:1)
第一种最简单的方法是摆脱静态库,只是将源文件直接包含在依赖项目中。我经常发现中间静态库比它们的价值要麻烦得多。当它们提供显着的构建性能改进时,它们的一大好处就来了,但是它们不能在这里,因为无论如何你都在为每个最终目标重建静态库。
我会说使用#defines类型几乎总是让我哭泣,并且可能暗示一个可以更好地处理的设计缺陷。例如,您可能希望实现返回所需类的方法(UIView layerClass
的方式)。更改类型定义的预处理器技巧可能会导致极其微妙的错误。 (我刚刚追查了去年的一个案例......这是一次可怕的,可怕的崩溃。)
也就是说,使用xcconfig文件可以解决此问题的某些版本的另一种方法。例如,如果实际存在静态库的多个副本(即,这是通常复制到其他项目中的库),则可以使用具有#include "../SpecialTypeDefs.xcconfig"
的xcconfig文件。该文件将由每个项目提供以设置特殊声明。未能定义该文件将导致编译器错误,因此很容易没有错误。
但就个人而言,我只是直接将文件包含到实际项目中,并跳过库,除非它们非常庞大。