我正在编写一些半便携式代码,并希望能够检测我何时为 iPhone 编译。所以我想要类似的东西#ifdef IPHONE_SDK...
。
大概Xcode定义了一些东西,但我在项目属性下看不到任何东西,谷歌也没有太大帮助。
我正在编写一些半便携式代码,并希望能够检测我何时为 iPhone 编译。所以我想要类似的东西#ifdef IPHONE_SDK...
。
大概Xcode定义了一些东西,但我在项目属性下看不到任何东西,谷歌也没有太大帮助。
它位于“有条件地编译源代码”下的 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*] = ...