现在的位置: 首页fault, php>正文
分析并解决php编译时iconv出现lundefined reference to `libiconv_open’
2012年11月16日 fault, php 暂无评论 ⁄ 被围观 6,551 view+

php编译参数如下:

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-static --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --enable-bcmath

在configrue后运行make ZEND_EXTRA_LIBS='-liconv' 或者 make都报如下错误

xxx/ext/xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open'
xxx/ext/xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv'
xxx/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close'
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php-cgi] Error 1

无奈,只能上网查询解决方法,大致有以下两种解决的办法:

1.表面看,是libiconv安装问题,重装libiconv之后问题依旧,网上看有人舍弃libiconv,使用 –without-iconv,我觉的不可取,这样是回避问题。那php开发者就无法使用iconv方法了,这个很扯淡。。。

2.在执行完 ./configure … 之后,修改下 Makefile,在后面添加 -liconv 即可解决问题。

但我们还是无法找到问题到底出现在什么地方,后来仔细检查php的编译参数,发现有个--enable-static,这个又是作甚的,后来查询了php手册,如下讲解--enable-static[=PKGS] 编译静态库 [default=yes]。也就是静态加载 跟apahce加载静态so一样,但libiconv是 with的,属于动态加载,这样就产生冲突了,网上说使用enable-static能提高性能,这个就不清楚到底有没有提高了。既然知道了问题所在,就好办多了,解决方法:

1.编译php的时候去除--enable-static选项,即可

2.libiconv编译的时候指定为静态

./configure --prefix=/usr/local/libiconv --enable-static ....

即可解决问题。以上问题来自zero童鞋的分析总结!感谢zero的分享!

所以综上不管你是否静态编译php在编译libiconv的时候加上参数--enable-static,libiconv 默认是动态加载,php编译时如果加enable-static就会出现问题,这样就一劳永逸了。

给我留言

留言无头像?


×
腾讯微博