xcconfig:为Debug/Release设置不同的预处理宏

5

我创建了一个包含以下内容的简单.xcconfig文件,并应用它:

GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE

和包含主.cpp文件

#include <iostream>

// This warning IS shown
#if DEBUG
#warning DEBUG is set to 1
#endif

// This warning IS NOT shown
#ifdef FOODEBUG
#warning FOODEBUG is set
#endif

// This warning IS NOT shown
#ifdef FOORELEASE
#warning FOORELEASE is set
#endif

int main(int argc, const char * argv[])
{
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

现在我想知道为什么main.cpp中FOODEBUG和FOORELEASE都没有定义?!

如预期的那样,构建设置显示了我的.xcconfig文件中的两行内容(“任何架构|任何SDK”),但实际上它们并没有被使用。

Xcode截图

我该怎么做才能实现这个?

2个回答

4
如果您有一个预处理器宏,需要给它赋值才能像使用它那样使用它,请参考我其中一个项目设置的截图:

enter image description here

您可以访问DEBUG的原因是#if#ifdef之间的不同行为。 当宏存在时,#if将为true,而#ifdef则为非零值。我建议始终将值分配为1以保险起见,因为我不确定上述内容是否适用于所有编译器版本。

更新:
之前不知道,但似乎config=Debug不起作用。虽然宏在设置中可见,但它们不会继承上来。 有效的方法是使用类似于此的2个xcconfig文件:

Release.xcconfig:

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOORELEASE=1

Debug.xcconfig

#include "Release.xcconfig"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOODEBUG=1

请参见James Moore在此处的答案:如何在xcconfig变量中附加值?

这个回答如何解决问题? - AndiDog
抱歉表述不清,请查看我编辑过的答案。 我不是在谈论更改宏,而是分配一个非零值。希望这有所帮助。 - dogsgod
我仍然不明白这与我的问题有什么关系。对我来说,区别非常明显,但是Xcode根本没有定义任何宏。在这里有没有值都不应该有影响。 - AndiDog
1
看起来你不能通过单个配置文件实现这一点,你需要为调试和发布分别使用不同的文件。我已经更新了答案,并提供了一个例子。 - dogsgod
#if 当宏存在时为真,#ifdef 当其具有非零值时为真。- 这是相反的情况。 - The_Falcon
显示剩余2条评论

0

你需要这样定义预处理宏:

GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = $(inherited) FOODEBUG=1
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = $(inherited) FOORELEASE=1

更多细节请参阅官方文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接