起因
这阵子换了新电脑,重新安装了系统,重新部署环境,装了宝塔面板,在装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
一切正常….
评论
Twikoo V1.6.39