【问题标题】:Xcode: define preprocessor macro in one project used by another projectXcode:在另一个项目使用的一个项目中定义预处理器宏
【发布时间】:2013-11-22 10:22:09
【问题描述】:

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

目前我在静态库项目中有一个条件编译头文件,我们称之为 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 不使用工作区)。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 因为这是一个面向最终用户的库,所以我不能放弃静态库。从自定义构建设置到安装(拖放)到更新(替换文件夹内容),静态库项目具有许多优点。虽然这给了我一个想法:我可以简单地在库项目中拥有多个目标,然后我可以分别为每个目标定义宏。
    猜你喜欢
    • 2012-12-29
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多