Что #defines устанавливает Xcode при компиляции для iPhone - PullRequest
64 голосов
/ 29 сентября 2008

Я пишу некоторый полупортативный код и хочу иметь возможность определять, когда я компилирую для iPhone. Поэтому я хочу что-то вроде #ifdef IPHONE_SDK....

Предположительно, Xcode что-то определяет, но я ничего не вижу в свойствах проекта, и Google не сильно помогает.

Ответы [ 3 ]

112 голосов
/ 29 сентября 2008

Он находится в документации SDK в разделе «Условная компиляция исходного кода»

Соответствующими определениями являются TARGET_OS_IPHONE (и он устарел TARGET_IPHONE_SIMULATOR), которые определены в /usr/include/TargetConditionals.h в структуре iOS. В более ранних версиях набора инструментов вы должны были написать:

#include "TargetConditionals.h"

но это больше не требуется для текущей (xCode 6 / iOS8) цепочки инструментов.

Так, например, если вы хотите скомпилировать блок кода, только если вы собираете для устройства, то вам нужно сделать

#if !(TARGET_OS_SIMULATOR)
...
#endif
24 голосов
/ 06 октября 2008

Чтобы посмотреть все определенные макросы, добавьте их в «Другие флаги C» вашей конфигурации сборки:

-g3 -save-temps -dD

Вы получите некоторые ошибки сборки, но компилятор поместит все определения в файлы .mi в корневом каталоге вашего проекта. Вы можете использовать grep для их просмотра, например:

grep define main.mi 

Когда вы закончите, не забудьте удалить эти параметры из настроек сборки.

1 голос
/ 14 сентября 2017

Ответы на этот вопрос не совсем верны. Вопрос о платформе и оборудовании против симулятора является ортогональным.

Не используйте архитектуру в качестве ярлыка для обнаружения платформы или симулятора! Такое неаккуратное мышление на протяжении многих лет вызывало у многих и многих программистов изжогу и головную боль.

Вот диаграмма 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*] = ...
...