记录一些PHP7RCC1编译问题

1,php7rc1源码编译undefined symboles的问题

自己计划将php7环境部署到cubieboard上,懒得去找别人预编译的版本,所以动手从源码编译,中间遇到了一个小问题,此处记录一下。

PHP的build系统是类似于automake,一般简单执行configure/make/make install就可以编译安装了,但我是需要进行交叉编译的,需要额外指定工具链和目标环境参数,具体如下

1 ./configure 
2     --prefix=/usr/local/php7 
3     --host=arm-linux 
4     CC=/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-gcc 
5     CPP='/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-gcc -E' 
6     CXX=/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-g++ 
7     CXXCPP='/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-g++ -E' 
8     --disable-all 
9     --enable-fpm

之后make过程中出错,报告phpdbg_prompt.o有DL_LOAD/DL_FETCH_SYMBOL/DL_UNLOAD等的undefined symboles。

从名字上看很自然就知道,这是没找到动态库加载的相关函数,对源码进行一番grep之后,发现上面这几个实际上是一些动态库加载函数抽象宏,在zend_portability.h文件中进行定义的,具体是在128到163行之间,由HAVE_LIBDL宏进行开关控制。再对HAVE_LIBDL进行一番grep之后,发现没有具体定义的地方,于是自然想到手工进行添加。

简单浏览了一下Makefile,发现还挺好修改的,最后在CFLAGS_CLEAN中额外加上-DHAVE_LIBDL=1,并且在EXTRA_LIBS加上-ldl之后,clean之再重新make,问题解决。

2,模块单独编译

用过PHP的人都知道,PHP的模块是支持动态加载的,并且也支持单独编译的。在PHP手册里已有描述具体的编译方法,如下

1 $/path/to/phpize
2 $./configure --with-php-config=/path/to/php-config
3 $make && make install

由于是交叉编译,同样需要额外制定工具链和build目标环境参数,如下

/usr/local/php7/bin/phpize

./configure 
        --with-php-config=/usr/local/php7/bin/php-config 
        --host=arm-linux 
        CC=/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-gcc 
        CPP='/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-gcc -E' 
        CXX=/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-g++ 
        CXXCPP='/home/debian/local/arm-sunxiA20-linux-gnueabi/bin/arm-sunxiA20-linux-gnueabi-g++ -E'

说明一下/usr/local/php7是上面php编译安装的目的路径,执行make install之后,生成的二进制环境和开发build环境一起被安装。在单独编译模块时,需要先编译安装php自身。

~~ end ~~

原文地址:https://www.cnblogs.com/lanyuliuyun/p/4769452.html