2009-06-22 42 views
8

我想在同一個XCode項目中使用我的iPhone應用程序的2個版本。 代碼庫幾乎相同,我需要有不同的行爲,我決定使用預處理器的條件和${TARGET_NAME}標籤。如何在XCode上檢查我的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

難道你不是說你總是從「TARGET_NAME == myApp」總是真的打印出「pro」嗎? – Marty 2012-04-19 03:29:10

回答

11

你不能在一個#if塊比較喜歡的字符串。相反,將定義添加到每個特定的目標。例如,在完整版本的目標上,打開「信息」面板並轉到「生成」選項卡,然後在GCC_PREPROCESSOR_DEFINITIONS版本設置中添加諸如FULL_VERSION之類的內容。然後,對於精簡目標,輸入如LITE_VERSION。在你的代碼,你可以這樣做:

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

謝謝,我想我會這樣做。在開始的時候,我一直在尋找這個解決方案,但是由於我在一些博客上發現了這些內容(比如「here」:http://www.pacificspirit.com),所以我被困在了#if塊的比較中。com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode)但它似乎是不可能的...再次感謝 – onigiri 2009-06-22 13:17:25

-1

讓你的條件評估工作,你必須做一些事情,如:

#define myApp  1 
#define myAppLite 2 

事前,就像你_Prefix.pch文件。

1

其實你可以得到目標的名字進行比較,但是這不會在編譯時跳過從其他目標不必要的代碼,要做到這一點:

首先進入菜單產品 - >計劃 - >編輯方案。 ..(或CMD + <) 然後在參數部分,裏面添加的環境變量是這樣的:

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

的#define中的代碼將被編譯並執行,如果我的目標是「MLBGoldPA」

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
相關問題