Xcode 9.3编译iOS框架时TARGET_OS_IPHONE条件判断异常求助
嘿,这个问题我之前也碰到过几次,大概率是Xcode的目标配置或者宏定义出了小问题,给你几个排查方向:
先确认当前编译的目标和SDK设置
先看Xcode顶部的scheme选择,是不是不小心选成了macOS的目标?再去目标的Build Settings里检查「Base SDK」和「Deployment Target」,确保Base SDK是iOS,Deployment Target设置的是iOS版本(比如9.0+),而不是macOS的版本。检查预处理器宏的手动定义
去Build Settings -> Apple Clang - Preprocessing -> Preprocessor Macros里,看看Debug和Release配置下有没有手动加了TARGET_OS_IPHONE=0或者TARGET_OS_IOS=0这类宏?有时候复制配置或者误操作会加上这个,直接把条件判断搞反了。换个更可靠的判断宏
TARGET_OS_*系列宏有时候会因为交叉编译或者SDK的兼容问题出现误判,试试用__IPHONE_OS_VERSION_MIN_REQUIRED来判断,这个宏只要你的目标是iOS就会被定义,代码改成这样:#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) #warning "BUILDING IPHONE" #else #warning "BUILDING MAC" #endif这个比TARGET_OS_*要稳定很多。
清理Xcode缓存
Xcode的缓存有时候会抽风,试试按住Option键点击顶部菜单的「Product」,选择「Clean Build Folder」,再去「Window -> Projects」找到你的项目,删除Derived Data,然后重新编译试试。检查文件的Target Membership
看看你写这段条件编译的代码文件,是不是同时被加到了macOS的target里?如果同一个文件属于多个target,编译macOS target的时候就会走else分支,确保你当前编译的是iOS target,或者调整文件的target membership只包含iOS目标。
内容的提问来源于stack exchange,提问作者strangetimes

