Какие #defines настраиваются Xcode при компиляции для iPhone
-
02-07-2019 - |
Вопрос
Я пишу полупереносимый код и хочу иметь возможность определять, когда я компилирую его для iPhone.Поэтому я хочу что-то вроде #ifdef IPHONE_SDK...
.
Предположительно, Xcode что-то определяет, но я ничего не вижу в свойствах проекта, и Google не особо помогает.
Решение
Он находится в документации SDK в разделе «Условная компиляция исходного кода».
Соответствующими определениями являются TARGET_OS_IPHONE (и он устарел TARGET_IPHONE_SIMULATOR), которые определены в /usr/include/TargetConditionals.h в рамках iOS.В более ранних версиях тулчейна вам приходилось писать:
#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*] = ...