web-dev-qa-db-ja.com

iPhone用にコンパイルするときにXcodeによって設定される#defines

セミポータブルコードを書いているので、iPhone用にコンパイルしていることを検出できるようにしたい。だから私は#ifdef IPHONE_SDK...

おそらくXcodeが何かを定義していますが、プロジェクトのプロパティの下には何も表示されず、Googleはあまり役に立ちません。

64
Airsource Ltd

SDKドキュメントの「ソースコードの条件付きコンパイル」にあります。

関連する定義はTARGET_OS_IPHONE(および非推奨のTARGET_IPHONE_SIMULATOR)であり、iOSフレームワーク内の/usr/include/TargetConditionals.hで定義されています。ツールチェーンの以前のバージョンでは、次のように書く必要がありました。

#include "TargetConditionals.h"

ただし、これは現在の(xCode 6/iOS8)ツールチェーンでは不要です。

したがって、たとえば、デバイス用にビルドしている場合にコードブロックのみをコンパイルする場合は、次のようにする必要があります。

#if !(TARGET_OS_SIMULATOR)
...
#endif
113
Airsource Ltd

定義されたすべてのマクロを確認するには、ビルド構成の「その他のCフラグ」にこれを追加します。

-g3 -save-temps -dD

ビルドエラーが発生しますが、コンパイラはすべての定義をプロジェクトのルートディレクトリの.miファイルにダンプします。 grepを使用してそれらを見ることができます。例えば:

grep define main.mi 

完了したら、ビルド設定からこれらのオプションを削除することを忘れないでください。

24
lajos

この質問への答えはまったく正しくありません。プラットフォームとハードウェア対シミュレータの問題は直交しています。

プラットフォームまたはシミュレーター検出のショートカットとしてアーキテクチャーを使用しないでください!この種のずさんな思考は、多くのプログラマーを長年にわたって多大な胸焼けと頭痛の種にしています。

以下にASCII条件のチャートを示します。名前は必ずしも歴史的な理由から意味がありません。

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MACは、すべてのAppleプラットフォームに当てはまります。


TARGET_OS_OSXはmacOSのみに当てはまります

TARGET_OS_IPHONEは、iOS、watchOS、およびtvOS(デバイスおよびシミュレーター)に当てはまります。


TARGET_OS_IOSは、iOS(デバイスおよびシミュレーター)に対してのみ真です

TARGET_OS_WATCHは、watchOS(デバイスおよびシミュレーター)に対してのみtrue

TARGET_OS_TVは、tvOS(デバイスおよびシミュレーター)に対してのみ真です。


TARGET_OS_EMBEDDEDは、iOS/watchOS/tvOSハードウェアのみに当てはまります

TARGET_OS_SIMULATORは、シミュレーターのみに当てはまります。


プラットフォームごとにxcconfigファイルの設定を条件付けできることにも注意してください。

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
1
russbishop