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也做不到。

 
 
posted @ 2019-04-19 23:59  RickGuo  阅读(8173)  评论(0编辑  收藏  举报