2012-09-25 88 views
0

我想要一些代碼編譯在10.6及以下,但不是10.7及以上。不同版本的Mac OS X之間的單獨代碼?

例如:

#ifdef current version is MAC_OS_X_VERSION_10_6 or below 

// do this 

elif current version is MAC_OS_X_VERSION_10_7 or above 

//do that 

#endif 

有人可以幫助我正確葛宏呢?我看着AvailabilityMacros.h,但無法找出正確的ifdef。

我有一個動態庫,它不能在10.7或更高版本下加載,但在10.6下正確加載。這是由於私人標誌_CGContextAppendPath。我想保持它在10.6及以下使用,但要避免在10.7及更低版本中使用它。這是因爲_CGContextAppendPath符號在10.7及以上不存在。

我用,

SInt32 version = 0; 
Gestalt(gestaltSystemVersion, &version); 

bool lionabove = (version >= 0x1070); 

沒有工作。

+0

你的問題不清楚;如果項目的部署目標是10.6或更低,您是否想要編譯一些代碼? – trojanfoe

+0

試圖在10.7下加載它會發生什麼? – MrMage

+0

dlopen()返回null。但是,如果我評論使用CGContextAppendPath(),它工作正常。這是因爲該符號不在10.7及以上。 – MacGeek

回答

2

對於目標C來說,去往路線將是通過例如檢查特定API的可用性。 [object respondsToSelector:]

對於您正在使用的C庫,與CoreGraphics.framework的弱鏈接(因此,當某些功能不存在時加載不會失敗)並通過&_CGContextAppendPath != NULL檢查有問題的功能的可用性。

詳細信息在http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Configuring/configuring.html#//apple_ref/doc/uid/10000163i-CH1-107837http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-1114537-BABHHJBC

+1

請看標籤並閱讀問題。它被標記爲'osx'和'cocoa',並且該問題明確說明了'MAC_OS_X_VERSION'。 – TheAmateurProgrammer

+0

是的,我認爲MacGeek會誤解爲不同的操作系統版本創建不同的代碼。 – MrMage

+0

我認爲MacGeek所說的是他想要在運行時決定執行不同的代碼行,如果我沒有弄錯,不需要編譯時間。 – TheAmateurProgrammer

0

Apple爲iOS和Mac OS 10.6及更高版本(位於<SDK>/usr/include/Availability.h)推出了一個新的Availability.h宏文件。你可以做你的要求是這樣的:

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 
    // code to run up through 10.6 
#else 
    // code to run on 10.7 or higher 
#endif 

注意,這個宏也可以(這可能是最好根據你的邏輯):

#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 
    // code to run on 10.7 or above 
#else 
    // code to run below 10.7 
#endif  

這個文檔是在這裏:Conditionally Compiling for Different SDKs ,如果你在混合使用iOS和Mac OS X代碼,特別值得一看。我也強烈推薦閱讀上面提到的頭文件。