Xcode编译iPhone时设置了什么#defines
我正在写一些半可移植的代码,并希望能够检测到我编译的iPhone。 所以我想要像#ifdef IPHONE_SDK...
大概Xcode定义了一些东西,但是在项目属性下我看不到任何东西,Google也没什么帮助。
它位于“有条件编译源代码”下的SDK文档中
相关的定义是在iOS框架内的/usr/include/TargetConditionals.h中定义的TARGET_OS_IPHONE(以及他弃用的TARGET_IPHONE_SIMULATOR)。 在早期版本的工具链上,你必须写:
#include "TargetConditionals.h"
但是对于当前的(xCode 6 / iOS8)工具链,这已经不再需要了。
所以,举个例子,如果你只想编译一个代码块,如果你正在构build设备,那么你应该这样做
#if !(TARGET_OS_SIMULATOR) ... #endif
要查看所有已定义的macros,请将其添加到您的构buildconfiguration的“其他C标志”中:
-g3 -save-temps -dD
你会得到一些构build错误,但是编译器会把所有的定义转储到项目根目录下的.mi文件中。 您可以使用grep来查看它们,例如:
grep define main.mi
完成后,不要忘记从构build设置中删除这些选项。
这个问题的答案是不正确的。 平台和硬件与模拟器的问题是正交的。
不要使用架构作为平台或模拟器检测的捷径! 这种草率的思维方式使得许多程序员多年来都感到非常沮丧和头痛。
这是一个条件的ASCII图表。 由于历史原因,名称不一定有意义:
+--------------------------------------+ | TARGET_OS_MAC | | +---+ +---------------------------+ | | | | | TARGET_OS_IPHONE | | | |OSX| | +-----+ +----+ +-------+ | | | | | | | IOS | | TV | | WATCH | | | | | | | +-----+ +----+ +-------+ | | | +---+ +---------------------------+ | +--------------------------------------+ Devices: TARGET_OS_EMBEDDED Simulators: TARGET_OS_SIMULATOR
TARGET_OS_MAC适用于所有苹果平台。
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*] = ...