Apple Silicon用make -j多线程编译时为何提示权限拒绝?
问题分析与解决方案
核心问题
在Apple M1 Max(macOS 12.7.3)上使用make -j2及以上多线程编译时,调用/opt/homebrew/opt/llvm/bin/clang出现Permission denied,但单线程make或sudo make -j8正常;同版本系统和clang(17.0.6)的Intel Mac无此问题,账号已拥有管理员权限。
可能原因及解决步骤
1. Homebrew路径的多进程访问触发系统限制
M1 Mac的Homebrew默认安装路径为/opt/homebrew(Intel Mac为/usr/local),系统对该路径的多进程并发访问可能触发**系统完整性保护(SIP)**或隐私安全的隐性阈值限制——单线程调用未达到触发条件,多线程并发则触发拦截。
- 排查与解决:
- 先检查clang及父目录的权限是否正常:
正常权限要求:ls -ld /opt/homebrew /opt/homebrew/opt/llvm /opt/homebrew/opt/llvm/bin/clang/opt/homebrew:所有者为你的管理员账号,权限为drwxr-xr-x- clang二进制文件:权限为
-r-xr-xr-x(确保所有用户拥有可执行权限)
- 若权限无误,可临时关闭SIP测试(注意:关闭SIP有安全风险,测试后务必恢复):
- 长按电源键重启Mac进入恢复模式,选择「选项」进入系统恢复界面
- 打开终端,执行
csrutil disable - 重启后测试
make -j8 - 测试完成后再次进入恢复模式,执行
csrutil enable恢复SIP
- 先检查clang及父目录的权限是否正常:
2. 多线程触发文件描述符上限不足
多线程编译会同时打开大量文件,M1 Mac的默认文件描述符上限可能低于Intel Mac,导致clang无法获取足够资源,系统错误提示为权限拒绝(实际是资源不足)。
- 解决步骤:
- 临时提高文件描述符上限,测试是否有效:
ulimit -n 10240 make -j8 - 若有效,可永久设置上限:
创建~/Library/LaunchAgents/limit.maxfiles.plist文件,内容如下:
执行<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>limit.maxfiles</string> <key>ProgramArguments</key> <array> <string>launchctl</string> <string>limit</string> <string>maxfiles</string> <string>10240</string> <string>65536</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceIPC</key> <false/> </dict> </plist>launchctl load ~/Library/LaunchAgents/limit.maxfiles.plist,重启后生效。
- 临时提高文件描述符上限,测试是否有效:
3. Homebrew的LLVM包安装不完整或损坏
单线程编译时可能未触发clang的部分并发依赖加载,若LLVM包存在损坏,多线程场景下会暴露为权限类错误。
- 解决步骤:
重新安装后再次测试多线程编译。brew uninstall llvm brew install llvm brew link llvm --force
4. 终端应用的完全磁盘访问权限缺失
若使用的终端(如Terminal、iTerm2)未获得「完全磁盘访问」权限,多线程并发访问/opt/homebrew路径时会被系统拦截。
- 解决步骤:
- 打开系统偏好设置→安全性与隐私→隐私→完全磁盘访问
- 勾选当前使用的终端应用
- 重启终端后测试
make -j8
内容的提问来源于stack exchange,提问作者user1261695
相关产品推荐
相关产品推荐

