/Library/Developer/CommandLineTools/SDKs下SDK的安装来源及相关疑问
旧SDK的来源
你/Library/Developer/CommandLineTools/SDKs路径下的MacOSX10.14.sdk、MacOSX10.15.sdk是之前安装独立版Command Line Tools for Xcode遗留的文件,不属于系统升级或者Xcode自动升级的默认产物。早期你安装过对应 macOS 10.14、10.15 版本的独立Command Line Tools包,后续升级过程中旧版本SDK没有被自动清理,就保留在了这个路径。
为什么存在两个SDK存放路径
两个路径的SDK服务于不同的使用场景:
/Applications/Xcode.app/Contents/Developer下的SDK是Xcode IDE专用的,包含全平台(iOS、iPadOS、watchOS、macOS等)的所有开发资源,同时包含对应版本的toolchain,支持多平台开发需求。/Library/Developer/CommandLineTools下的SDK专门服务于命令行开发场景,比如你在终端直接调用clang、make、cmake等工具编译代码时,不需要启动Xcode就可以调用这部分SDK,哪怕你完全不安装Xcode,只装独立的Command Line Tools包也可以完成基础的macOS命令行开发。
SDK和toolchain的区别
两者完全不属于同一类组件:
- SDK是开发特定系统版本所需的头文件、系统动态库、编译配置文件的集合,比如MacOSX10.15.sdk就是用来开发兼容 macOS 10.15 版本程序所需的资源集合,只对应特定平台的特定版本。
- Toolchain是一整套编译工具链,包含clang编译器、链接器、汇编器、调试器、标准库实现等,是实际将代码转换成可执行程序的工具集合,一套toolchain可以支持编译多个不同版本、不同平台的SDK。
你在Xcode偏好设置的组件页面看不到内容,是因为该页面仅展示你额外安装的第三方/自定义toolchain,Xcode自带的默认toolchain不会在这个页面展示,和你存的旧SDK没有关系,SDK本身就不属于toolchain的组成部分。
为什么没有新版本SDK
因为你后续没有再单独安装过对应 macOS 11、12 版本的独立Command Line Tools包,你当前xcode-select已经指向了Xcode内部的开发者路径,后续系统或者Xcode升级时,只会更新Xcode内部的SDK资源,不会主动往/Library/Developer/CommandLineTools路径下写入新的SDK,自然就没有对应新版本的文件。如果你之后需要在命令行场景下调用新版本SDK,执行xcode-select --install安装最新的独立Command Line Tools包,就会自动在对应路径下生成匹配当前系统的新版本SDK。
内容的提问来源于stack exchange,提问作者rayx

