Mac OS下编译php扩展报错,找不到php.h文件
-- 错误提示 --
扩展源码目录下执行
$ phpize
提示错误
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
或者
fatal error: 'php.h' file not found
-- 本文适用于操作系统版本 --
Mac OS ~10.15
Mac OS 11
-- 错误原因 --
Mac OS 10.15版本及之后,XCode为了携带多个版本的SDK,将和系统版本号匹配的多个支持的SDK版本存放于以下路径:
/Library/Developer/CommandLineTools/SDKs/{$OS_VersionName}.sdk/usr/include
原来的路径 /usr/include 是空目录,导致找不到SDK头文件
-- 错误解决过程 --
关闭SIP
重启电脑,按住Command+R 进入Recovery Mode
选单->实用工具->终端
禁用SIP机制
sudo csrutil disable
->重启Mac
检查是否已安装XCode Command Line Tools
安装 XCode Command Line Tools
xcode-select --install
运行命令建立SDK include目录的软链接
Mac OS ~10.15
sudo mount -uw /
(挂载为读写文件系统)
sudo rm -rf /usr/include sudo ln -s "$(xcrun --show-sdk-path)/usr/include" /usr/include
(建立软链接)
恢复挂载为只读文件系统
sudo mount -t apfs -u "/dev/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')" /
(这里文件系统为默认的apfs,根目录设备文件通过 $ df -h 查看)
Mac OS 11 (需要通过修改系统镜像的方式)
sudo mkdir -p "/usr/local/media/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')/" sudo mount -o nobrowse -t apfs "/dev/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')" "/usr/local/media/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')/" sudo rm -rf "/usr/local/media/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')/usr/include" sudo ln -s "$(xcrun --show-sdk-path)/usr/include" "/usr/local/media/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')/usr/include" sudo bless --folder "/usr/local/media/$(df -h | grep '/\s*$' | sed 's/\/dev\/\(disk[0-9]*s[0-9]*\).*$/\1/g')/System/Library/CoreServices/" --bootefi --create-snapshot sync
->重启Mac
->继续php extension编译进程
-- 拓展问题 --
某一些SDK通过源安装二进制包,只有动态链接库,没有静态链接库。这个时候可以从该组件官方渠道获取源码,再手动编译,编译安装之后,会得到SDK头文件、静态链接库、动态链接库
例如:在Mac OS 10.15版本上为MAMP Pro上的php编译gmp扩展,建立gmp库支持时遇到过此问题
-- 扩展阅读 --
建议用Mac OS做开发把SIP保持关闭,安装杀毒软件,APP Store 搜索 "AntiVirus One" 杀毒软件,占用资源忽略不计,杀毒能力较好,支持实时监控,订阅费用每年143元(1.1 2021当时价格)。
第三方软件源,强烈推荐使用macports,而非brew。macports和Mac OS使用的库是隔离的,从理念和原理上讲,macports更先进和严谨,从软件本身质量和实际表现上讲,macports远比brew要稳定,基本上从来不出问题。如果用brew作无谓的折腾、需要频繁地调试错误,也就失去了使用Mac的意义,不如直接使用Linux。
macports新版本大部分软件都是llvm编译,安装软件速度非常快,中小容量软件和直接解包区别不大,并且所有软件包同时支持X86-64和Arm平台,这一点brew也做不到。