2012-08-08 101 views
0

我有一個iOS項目有兩個目標,一個是打算成爲完整版本,而另一個將是精簡版。 我使用以下代碼來隱藏/顯示功能。使用預處理器宏的條件編譯Xcode

#ifdef FULL_VERSION 
    NSLog(@"Full version"); 
#endif 

如果我在項目級定義預處理器宏,但是當我將它們設置在目標級別時它們不起作用,這很好用。 順便說一句,我將它們設置是這樣的:

Apple LLVM compiler 3.0 - Preprocessing 
    Preprocessor Macros FULL_VERSION 

我需要在目標水平,從而知道哪個版本正在運行來定義它們。

任何想法,他們爲什麼只在項目級別工作?

+0

你爲什麼設置完整版本,你不應該設置FULL_VERSION? – 2012-08-08 19:40:37

+0

@GordonDove我在這裏寫錯了,但我在代碼和預處理器宏中都有FULL_VERSION。但我仍然有這個問題。 – OtoLeo 2012-08-09 16:29:48

回答

1

我的問題是該計劃沒有指出正確的目標。編輯該計劃解決了這個問題。

0

在您的目標中,對於所有「預處理宏」,確保您具有與您在代碼中使用的完全相同的定義,以「提供FULL_VERSION」(減去引號)。展開該框以確保每個配置都有定義。

通過在左側窗格中選擇正確的圖標並選擇最上面的「Build」,您實際上可以看到編譯器在做什麼。找到正在編譯的文件,選擇該行,然後單擊該行最右側的圖標查看實際的編譯命令。我有兩個預處理器定義,您可以在下面看到。另外,選擇那個巨大的編譯行,將其粘貼到一個空的TextEdit窗口中,然後搜索「-D」 - 你應該在那裏看到-DFULL_VERSION。如果你沒有看到你,你沒有正確地輸入它在生成命令 - 錯誤的目標,錯誤的配置等。我從來沒有看到這個功能在使用Xcode的8年中失敗。

我的一個編譯行:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch i386 -fmessage-length=0 -std=c99 -fobjc-arc … -DUNIVERSAL -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -fexceptions … LTSharing.m -o ...LTSharing.o 
+0

是的,我在兩個方面都一樣。但我仍然有這個問題。 – OtoLeo 2012-08-09 16:27:31

0

預處理器定義並作爲預期目標,覆蓋或繼承的項目設置工作。

一個常見的錯誤是僅在一個(未使用的)配置上設置生成設置。檢查您是否在所有配置上設置預處理器定義。

您可以檢查構建日誌(Command-7)以查看是否將正確的選項傳遞給編譯器:搜索-DFULL_VERSION

+0

我在所有配置上設置了宏:構建,發佈和部署。檢查構建日誌我發現傳遞的唯一值是在項目設置上設置的值,在特定目標上進行overrrided的值不會傳遞給編譯器。 – OtoLeo 2012-08-09 17:54:28

+0

然後你有一些其他類型的錯誤,在你的Xcode版本中很少出現錯誤,或者只是犯了一個錯誤。 – 2012-08-10 01:42:37