【问题标题】:Setting a #define from the command line in xcode 4.6在 xcode 4.6 中从命令行设置 #define
【发布时间】:2026-01-22 19:05:03
【问题描述】:

我在使用 xcodebuild 进行命令行构建时尝试设置 #define 宏,但没有运气。

我已经尝试了-DMYMACRO=1MYMACRO=1 我能想到的所有其他方法,但没有任何效果。

如何从命令行设置#define?

【问题讨论】:

    标签: xcode xcode4 xcodebuild


    【解决方案1】:

    罗杰,

    您正在寻找的是一种通过命令行工具 xcodebuild 设置 GCC_PREPROCESSOR_MACROS 的方法。 xcodebuild 的手册页显示了应用这些设置的格式,但是 SYNOPSIS 部分仅将此称为“setting=value ...”

     xcodebuild [-project projectname] -scheme schemename [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...] [-userdefault=value ...]
     xcodebuild -workspace workspacename -scheme schemename [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...] [-userdefault=value ...]
    

    最终,您可以通过使用此格式并知道您希望更改的实际构建设置名称直接在命令行上设置任何构建设置值。自然,这就引出了问题……

    如何找到构建设置名称?

    很高兴你问! Xcode 4 的侧边栏是查找实际命令行构建设置名称的最简单位置。

    在查找构建设置名称时,Xcode 4 实用工具侧边栏的快速帮助检查器是查找的地方。

    1. 访问项目的构建设置屏幕。
    2. 单击 Xcode 右上角管理器按钮旁边的“实用工具”按钮,确保边栏(Xcode 称为“实用工具”)可见。
    3. 在实用工具侧边栏中,确保“快速帮助检查器”可见。

    或者,使用 Option+Command+2 直接显示快速帮助检查器!

    你终于可以找到你的构建设置了:

    1. 要么搜索要更改的构建设置,要么滚动浏览构建设置列表。
    2. 单击您感兴趣的构建设置并观察 Quick Help Inspector 更新。
    3. 快速帮助检查器的“声明”部分显示您要使用的命令行构建设置名称。

    对于您最初询问的预处理器宏设置,该设置是:

    GCC_PREPROCESSOR_DEFINITIONS

    将其归结为您的原始问题,您只需提供 SETTING_NAME='DESIRED_VALUE' 以及 xcodebuild 命令的其余部分,即可在命令行上设置此构建设置。对于一个名为“TestApp”的快速小测试项目,我希望将预处理器宏“BKM”设置为值 1,我的 xcodebuild 命令将是:

    xcodebuild -project TestApp.xcodeproj -scheme TestApp GCC_PREPROCESSOR_DEFINITIONS='${inherited} BKM=1'

    你为什么把 ${inherited} 放在那里?

    如果您使用的是预处理器宏,那么您可能使用的不止一个。其中一些您可能不想从命令行更改,但仍已编码到目标或项目的构建设置中。 '${inherited}' 的使用指示 xcodebuild 也使用在更高级别定义的构建设置,而不是仅使用我们在 xcodebuild 命令中定义的那些。在大多数情况下,您需要使用 ${inherited} 来提取您设置的任何其他配置值。

    我必须将值用撇号括起来吗?

    如果您想设置多个值,那么是的,您需要将值包含在撇号中,否则如果您从命令行设置两个或多个预处理器宏,则第二个 + 宏将被解释为构建设置而不是预处理器宏......不是完全正确的行为。撇号用作将多个值收集在一起的一种方式。对于我的示例 xcodebuild 命令,我想让 xcodebuild 使用继承的预处理器宏集以及我的特定 BKM 设置,因此我将值包装在撇号中,以告诉 xcodebuild 将它们都视为预处理器宏。

    这也适用于工作区吗?

    绝对!只需修改命令以使用 -workspace 参数而不是 -project 参数,您就可以开展业务了!

    【讨论】:

    • 注意:使用单撇号,而不是双撇号
    【解决方案2】:

    Swift 5+,Xcode 13+

    您可以将OTHER_SWIFT_FLAGS 传递给 xcodebuild:

    xcodebuild \
        build \
        "OTHER_SWIFT_FLAGS=${inherited} -D STAGING" \
        -target "TargetName" \
        -scheme "SchemeName"
    

    这将导致以下结果:

    #if STAGING
    // this will compile
    #else
    // this won't compile
    #endif
    

    【讨论】: