我正在尝试在同一个XCode项目中拥有2个版本的iPhone应用程序。
代码库几乎相同,我需要有不同的行为,我决定使用预处理器的条件和${TARGET_NAME}
标签。
我已将OTHER_CFLAGS
设置为包含“-DTARGET_NAME=${TARGET_NAME}
”。
然后在我的代码中我尝试了
#if TARGET_NAME == myApp
NSLog(@"pro");
#elif TARGET_NAME == myAppLite
NSLog(@"lite");
#endif
不幸的是我总是打印出“精简版”,因为TARGET_NAME == myApp
它总是正确的:因为TARGET_NAME
被定义了。我不能为我的生活弄清楚如何评估这个字符串比较。
有什么想法吗?
提前致谢
答案 0 :(得分:11)
您无法比较#if
块中的字符串。而是将定义添加到每个特定目标。例如,在完整版的目标上,打开“信息”面板,转到“构建”选项卡,然后将FULL_VERSION
添加到GCC_PREPROCESSOR_DEFINITIONS
构建设置中。然后,对于lite目标,输入LITE_VERSION
之类的内容。在您的代码中,您可以执行以下操作:
#ifdef FULL_VERSION
NSLog(@"Full");
#else
NSLog(@"Lite");
#endif
答案 1 :(得分:1)
实际上你可以获得目标的名称来比较它,但这不会在编译时从其他目标中跳过不必要的代码,为此:
首先转到菜单产品 - >方案 - >编辑方案...(或CMD +<) 然后在arguments部分中,添加内部环境变量,例如:
在您的代码中,您可以将目标的名称命名为:
NSString *targetName = [[NSProcessInfo processInfo] environment][@"TARGET_NAME"];
NSLog(@"target = %@", targetName); // Will print the target's name
您可以在运行时立即比较该字符串。
但是请按照您的示例:如果您希望在编译时省略所有Pro版本代码。你应该做@ jason-coco说的话。转到构建设置中的预处理器宏,然后在其中添加 $(TARGET_NAME)
:
如果我的目标是" MLBGoldPA"
,则会编译并执行#define中的代码#if defined MLBGoldPA
NSLog(@"Compiling MLBGoldPA");
#endif
答案 2 :(得分:-1)
要使条件评估有效,您必须执行以下操作:
#define myApp 1
#define myAppLite 2
预先,就像你的_Prefix.pch文件一样。