起因

这阵子换了新电脑,重新安装了系统,重新部署环境,装了宝塔面板,在装PHP8.1的时候,发现pathinfo怎么都装不上,一闪而过

没关系,咱是老PHPER了,直接自己编译,结果出现下面的错误

/www/server/php/81/ext/fileinfo/libmagic/funcs.c: In function ‘file_checkfmt’:
/www/server/php/81/ext/fileinfo/libmagic/funcs.c:97:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (const char *p = fmt; *p; p++) {
^
/www/server/php/81/ext/fileinfo/libmagic/funcs.c:97:2: note: use option -std=c99 or -std=gnu99 to compile

傻眼了,还没遇到过呢,果断百度之,啥都没有,得了,上谷歌搜,竟然也没有…

查找篇

但问题还要解决呀,就详细看了这个错误信息。

这里的附注让使用 -std=c99 或 -std=gnu99 来编译代码,看的我也是一脸懵,这我要加在哪里呀? 于是我就加在了make后面

make -std=c99

然后我得到了更多错误…

思考篇

这个时候去查了下c99,了解到的这是一个cc选项。

我们知道在使用phpize的时候是根据系统环境生成configure文件

而在执行configure会生成Makefile文件, make命令依赖Makefile进行构建,于是去查了下Makefile文件, 找到了下面的关键信息

25  CFLAGS = -g -O2
26 CFLAGS_CLEAN = $(CFLAGS)

于是尝试在第25行上添加-std=c99,也就是

25  CFLAGS = -std=c99 -g -O2
26 CFLAGS_CLEAN = $(CFLAGS)

然后继续

make clean && make && make install

正当我觉得一切OK的时候,突然发现,又有了新的报错….

/tmp/php-8.1.13/ext/fileinfo/libmagic/softmagic.c:507:7: error: expected identifier or ‘(’ before ‘__extension__’

char *strndup(const char *, size_t);

^

/tmp/php-8.1.13/ext/fileinfo/libmagic/softmagic.c:510:1: error: expected identifier or ‘(’ before ‘__extension__’

strndup(const char *str, size_t n)

解决篇

这次百度一下,百度到了…解决方式,再把Makefile的第25行的CFLAGS的-02删除掉,如下:

24 CC = cc
25 CFLAGS = -std=c99 -g
26 CFLAGS_CLEAN = $(CFLAGS)

然后重新 make

make clean && make && make install

一切正常….