升级最新OSX与Xcode后编译失败:ImageKit及AudioToolbox报错求助
先看你遇到的具体报错信息:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioQueue.h:867:30: error: expected ',' API_AVAILABLE(macos(10.6), ios(10.0), watchos(3.0), tvos(10.0)); ^
这个错误本质是宏定义冲突或者编译语法解析异常,结合你提到的两个场景(10.13编译ImageKit失败、升级后AudioToolbox报错),给你整理了针对性的解决步骤:
一、解决升级Xcode后AudioToolbox头文件编译报错
排查自定义宏冲突
很多老项目会自己定义API_AVAILABLE或者类似的宏,和系统SDK里的宏语法冲突。你可以在Xcode的Build Settings中搜索Preprocessor Macros,检查是否有自定义的API_AVAILABLE相关宏,要么删除它,要么重命名成项目独有的名称(比如MY_API_AVAILABLE)。调整编译语言/标准
这个报错大概率是C编译环境下的语法解析问题:系统的API_AVAILABLE宏在C模式下展开后不符合语法要求。你可以尝试:- 把包含
<AudioToolbox/AudioToolbox.h>的文件的编译类型改成Objective-C(在文件上右键 ->File Inspector->Type选择Objective-C Source); - 如果必须用C++,在
Build Settings里把C++ Language Dialect设置成GNU++17或者更新的标准,让编译器能正确解析宏语法。
- 把包含
调整头文件引入顺序
确保系统框架头文件先于自定义头文件引入,比如在代码里先写:#import <AudioToolbox/AudioToolbox.h>再引入你自己项目的头文件,避免自定义宏先定义覆盖了系统的
API_AVAILABLE。清理构建缓存
有时候旧缓存会导致奇怪的编译问题,执行Cmd+Shift+K清理项目,再按Cmd+Option+Shift+K彻底清理构建文件夹,之后重新编译试试。
二、解决OSX 10.13环境下ImageKit.framework编译失败
最新版Xcode已经不再支持MacOSX 10.13 SDK了,如果你必须在10.13环境下编译,需要:
- 下载对应版本的Xcode(比如Xcode 9.4.1,它是支持10.13的最后一个Xcode版本);
- 在项目的
Build Settings中,把Base SDK设置为MacOSX 10.13,Deployment Target也设为10.13; - 确保项目里的所有依赖框架都兼容10.13版本,避免引入只支持更高系统的API。
内容的提问来源于stack exchange,提问作者Vojtěch Melda Meluzín

