iPhone用にコンパイルするときにXcodeによって設定される#defines
-
02-07-2019 - |
質問
セミポータブルコードを書いているので、iPhone用にコンパイルするタイミングを検出できるようにします。したがって、 #ifdef IPHONE_SDK ...
のようなものが必要です。
おそらくXcodeは何かを定義しますが、プロジェクトのプロパティの下には何も表示されず、Googleはあまり役に立ちません。
解決
SDKドキュメントの「ソースコードの条件付きコンパイル」
関連する定義はTARGET_OS_IPHONE(および廃止予定のTARGET_IPHONE_SIMULATOR)であり、iOSフレームワーク内の/usr/include/TargetConditionals.hで定義されています。ツールチェーンの以前のバージョンでは、次のように書く必要がありました。
#include "TargetConditionals.h"
ただし、これは現在の(xCode 6 / iOS8)ツールチェーンでは不要になりました。
たとえば、デバイス用にビルドしている場合にコードブロックのみをコンパイルする場合は、次のようにします
#if !(TARGET_OS_SIMULATOR)
...
#endif
他のヒント
定義されているすべてのマクロを確認するには、これを「その他のCフラグ」に追加します。ビルド構成の:
-g3 -save-temps -dD
ビルドエラーが発生しますが、コンパイラはすべての定義をプロジェクトのルートディレクトリの.miファイルにダンプします。 grepを使用してそれらを見ることができます。例:
grep define main.mi
完了したら、これらのオプションをビルド設定から削除することを忘れないでください。
この質問への答えはまったく正しくありません。プラットフォームとハードウェアとシミュレータの問題は直交しています。
プラットフォームまたはシミュレーターの検出のショートカットとしてアーキテクチャを使用しないでください!この種のずさんな思考は、長年にわたって多くのプログラマーに多大な胸焼けと頭痛を引き起こしました。
これは条件の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(デバイスおよびシミュレータ)のみに当てはまります
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*] = ...