我目前有一些我需要构建的iPhone应用程序的特殊"风味".理想情况下,我想为每个"风味"设置一个方案,每个方案将定义(或设置)一个或多个预处理器定义,我可以使用它们在我的代码中进行分支,甚至可能预处理我的info.plist文件.这显然可以通过多个目标完成,但由于我可以拥有应用程序的许多不同"风格",因此使用方案来保持目标数量下降会很棒.我目前的想法是在一个预操作脚本中添加这些预处理器定义,但我不能在我的生活中找到任何更新GCC_PREPROCESSOR_DEFINITIONS的方法.由于它是一个环境变量,我不应该有权附加到GCC_PREPROCESSOR_DEFINITIONS吗?
我正在使用Xcode 3.2和xcconfig
文件.文件按目标组织.例如,我有一个debug.xcconfig
文件和一个文件release.xcconfig
.两者都使用通用设置,因此我添加了shared.xcconfig
两个包含的文件.
该shared.xcconfig
文件如下所示:
GCC_C_LANGUAGE_STANDARD = c99
GCC_WARN_ABOUT_RETURN_TYPE = YES
GCC_WARN_UNUSED_VARIABLE = YES
GCC_PREPROCESSOR_DEFINITIONS = SOME_COMMON_DEFINITIONS
Run Code Online (Sandbox Code Playgroud)
该debug.xcconfig
文件如下所示:
#include "Shared.xcconfig"
GCC_OPTIMIZATION_LEVEL = 0
Run Code Online (Sandbox Code Playgroud)
现在,我想DEBUG
在debug.xcconfig
文件中添加预处理器定义.如此问题所示,以下方法应该起作用:
GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS) DEBUG"
Run Code Online (Sandbox Code Playgroud)
这在Xcode 3.2中不起作用.Xcode文档还明确提到修改变量是不可能的,你只能覆盖它们.
你们怎么解决这个问题?
我创建并应用了一个简单的 .xcconfig 文件,其中包含
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE
Run Code Online (Sandbox Code Playgroud)
和 main.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;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道为什么在 main.cpp 中,既没有定义 FOODEBUG 也没有定义 FOORELEASE ??! …