macOS Big Sur下Clang编译找不到sys/sysmacros.h头文件解决方案问询
macOS 11 Big Sur 下
sys/sysmacros.h 缺失报错解决方案 报错根因
- macOS 属于 BSD 衍生体系,设备号相关接口的定义规则和 Linux/glibc 体系存在差异,你用到的
makedev()、major()、minor()三个接口,官方仅在 macOS 12.4 及以上版本才加入了sys/sysmacros.h头文件,你使用的 macOS 11 大版本不在原生兼容范围内,才会出现头文件找不到的报错。 - 安装 glibc 属于完全错误的解决方向:macOS 原生使用 Libc 系统库而非 glibc,强制安装不兼容的 glibc 会导致大量基础接口符号冲突,后续编译隐患极多,完全没必要为了三个宏引入整套第三方标准库。
可用解决方案
方案1:添加跨平台兼容代码(优先推荐)
不需要修改现有业务逻辑,仅需在代码的头文件引入部分添加条件编译适配块即可,兼容所有 macOS 版本和 Linux 平台:
// 设备号接口跨平台适配 #ifdef __APPLE__ #include <sys/ioctl.h> // 对齐macOS官方设备号规则:高8位为主设备号,低24位为次设备号 #ifndef makedev #define makedev(maj, min) (((maj) << 24) | ((min) & 0xffffff)) #endif #ifndef major #define major(dev) (((dev) >> 24) & 0xff) #endif #ifndef minor #define minor(dev) ((dev) & 0xffffff) #endif #else // Linux 平台正常引入原生头文件 #include <sys/sysmacros.h> #endif
上述宏定义完全对齐 macOS 官方的设备号拆分规则,和原生接口行为完全一致,不需要额外依赖任何第三方组件。
方案2:升级系统适配原生接口
如果你的开发环境允许升级系统,可以将 macOS 升级到 12.4(Monterey)及以上版本,升级后重新安装最新版 Xcode 命令行工具,sys/sysmacros.h 头文件会自动预装,直接引入即可使用官方提供的三个接口,无需修改代码。
注意事项
不要尝试通过 Homebrew 安装 glibc 解决该问题:
- Homebrew 官方源已经移除了 macOS 平台的 glibc 包,第三方 tap 提供的 glibc 包普遍存在适配问题,大概率会安装失败
- 即使安装成功,编译时强制链接 glibc 会导致生成的二进制无法在其他原生 macOS 环境运行,同时会和大量系统库产生符号冲突,后续维护成本极高。
内容的提问来源于stack exchange,提问作者kkors
相关产品推荐
相关产品推荐

