如何在XCode上查看我的iPhone应用程序的TARGET_NAME?

时间:2009-06-22 13:00:16

标签: iphone xcode preprocessor

我正在尝试在同一个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被定义了。我不能为我的生活弄清楚如何评估这个字符串比较。 有什么想法吗?

提前致谢

3 个答案:

答案 0 :(得分:11)

您无法比较#if块中的字符串。而是将定义添加到每个特定目标。例如,在完整版的目标上,打开“信息”面板,转到“构建”选项卡,然后将FULL_VERSION添加到GCC_PREPROCESSOR_DEFINITIONS构建设置中。然后,对于lite目标,输入LITE_VERSION之类的内容。在您的代码中,您可以执行以下操作:

#ifdef FULL_VERSION
NSLog(@"Full");
#else
NSLog(@"Lite");
#endif

答案 1 :(得分:1)

实际上你可以获得目标的名称来比较它,但这不会在编译时从其他目标中跳过不必要的代码,为此:

首先转到菜单产品 - >方案 - >编辑方案...(或CMD +<) 然后在arguments部分中,添加内部环境变量,例如:

setup environment variables

在您的代码中,您可以将目标的名称命名为:

NSString *targetName = [[NSProcessInfo processInfo] environment][@"TARGET_NAME"];
NSLog(@"target = %@", targetName); // Will print the target's name

您可以在运行时立即比较该字符串。

但是请按照您的示例:如果您希望在编译时省略所有Pro版本代码。你应该做@ jason-coco说的话。转到构建设置中的预处理器宏,然后在其中添加 $(TARGET_NAME)

enter image description here

如果我的目标是" MLBGoldPA"

,则会编译并执行#define中的代码
#if defined MLBGoldPA
    NSLog(@"Compiling MLBGoldPA");
#endif

答案 2 :(得分:-1)

要使条件评估有效,您必须执行以下操作:

#define myApp       1
#define myAppLite   2

预先,就像你的_Prefix.pch文件一样。