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 ~~