无法使用intl-support安装PHP 5.3.0

时间:2009-07-03 08:40:41

标签: php linux installation intl

目前我正在尝试在某些Linux测试服务器上安装PHP 5.3.0。由于我们迫切需要等待ext / intl,我们想查看它提供的功能。 我正在使用以下参数

成功运行configure
./configure
    --with-apxs2=/usr/local/apache2/bin/apxs
    --prefix=/usr/local/php
    --with-zlib-dir=/usr/local/zlib
    --with-imap=/.../imap-2006k
    --with-imap-ssl
    --with-openssl=shared
    --with-iconv=shared
    --with-zlib=shared
    --with-curl=shared
    --with-curlwrappers
    --enable-exif
    --with-ldap=shared,/usr/local/openldap
    --with-ldap-sasl
    --enable-mbstring=shared
    --with-mcrypt
    --enable-soap=shared
    --enable-sockets
    --enable-zip=shared
    --enable-pdo=shared
    --with-pdo-sqlite=shared
    --with-sqlite=shared
    --with-mysql=shared,/usr/local/mysql
    --with-pdo-mysql=shared,/usr/local/mysql
    --with-mysqli=shared,/usr/local/mysql/bin/mysql_config
    --with-mhash=shared,/usr/local/mhash
    --with-libxml-dir=/usr/local/libxml2
    --with-xsl=shared,/usr/local/libxslt
    --enable-xmlreader=shared
    --enable-xmlwriter=shared
    --with-gmp=shared
    --with-icu-dir=/usr/local/icu
    --enable-intl

ICU 4.2位于/usr/local/icu,PHP 5.2.9编译完美(没有int-和icu-options)。但是当我编译PHP 5.3.0源代码时,我得到了很多类似的错误消息

ext/intl/grapheme/.libs/grapheme_util.o(.text+0xbab):/.../php-5.3.0/ext/intl/grapheme/grapheme_util.c:208: undefined reference to `ubrk_close_4_2'

我很确定它与未找到共享库有关。设置

export LD_LIBRARY_PATH=/usr/local/icu/lib

无济于事。

有人能指点我一些解决方案吗?我很无能 - 我不是这些事情的真正专家......

修改

我刚刚重新检查并确保各种icu-libraries和相应的软链接都位于/usr/local/icu/lib

lrwxrwxrwx  1 root root       20 Jul  1 09:56 libicudata.so -> libicudata.so.42.0.1
lrwxrwxrwx  1 root root       20 Jul  1 09:56 libicudata.so.42 -> libicudata.so.42.0.1
-rw-r--r--  1 root root 16015140 Jul  1 09:56 libicudata.so.42.0.1
lrwxrwxrwx  1 root root       20 Jul  1 09:56 libicui18n.so -> libicui18n.so.42.0.1
lrwxrwxrwx  1 root root       20 Jul  1 09:56 libicui18n.so.42 -> libicui18n.so.42.0.1
-rwxr-xr-x  1 root root  2454770 Jul  1 09:56 libicui18n.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicuio.so -> libicuio.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicuio.so.42 -> libicuio.so.42.0.1
-rwxr-xr-x  1 root root    65299 Jul  1 09:56 libicuio.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicule.so -> libicule.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicule.so.42 -> libicule.so.42.0.1
-rwxr-xr-x  1 root root   356125 Jul  1 09:56 libicule.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libiculx.so -> libiculx.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libiculx.so.42 -> libiculx.so.42.0.1
-rwxr-xr-x  1 root root    75110 Jul  1 09:56 libiculx.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicutu.so -> libicutu.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicutu.so.42 -> libicutu.so.42.0.1
-rwxr-xr-x  1 root root   159330 Jul  1 09:56 libicutu.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicuuc.so -> libicuuc.so.42.0.1
lrwxrwxrwx  1 root root       18 Jul  1 09:56 libicuuc.so.42 -> libicuuc.so.42.0.1
-rwxr-xr-x  1 root root  1660769 Jul  1 09:56 libicuuc.so.42.0.1

make check运行了大量的测试 - 所有测试都成功了:

[All tests passed successfully...]
Elapsed Time: 00:00:25.000
make[2]: Leaving directory `/.../icu-4.2/source/test/cintltst'
---------------
ALL TESTS SUMMARY:
All tests OK:  testdata intltest iotest cintltst
make[1]: Leaving directory `/.../icu-4.2/source/test'
make[1]: Entering directory `/.../icu-4.2/source'
verifying that icu-config --selfcheck can operate
verifying that make -f Makefile.inc selfcheck can operate
PASS: config selfcheck OK
make[1]: Leaving directory `/.../icu-4.2/source'

编辑:回答VolkerK的questions

我从源代码安装了ICU 4.2,正如我在上面编写的构建过程,单元测试和安装都很顺利。

/usr/local/icu/bin/icu-config --version
4.2.0.1

/usr/local/icu/bin/icu-config --prefix
/usr/local/icu

/usr/local/icu/bin/icu-config --cppflags-searchpath
-I/usr/local/icu/include

/usr/local/icu/bin/icu-config --ldflags --ldflags-icuio
-lpthread -lm   -L/usr/local/icu/lib -licui18n -licuuc -licudata  -lpthread -lm   -licuio

objdump -C /usr/local/icu/lib/libicuuc.so.42.0.1
// doesn't work because of unrecognized argument -C

有关VolkerK评论的编辑:

不,没有涉及编译器的切换 - 我一个接一个地直接运行两个构建过程。 objdump /usr/local/icu/lib/libicuuc.so.42.0.1也不起作用,但我设法运行

objdump -t /usr/local/icu/lib/libicuuc.so.42.0.1 | grep ubrk_close
00000000000d2484 g     F .text  000000000000002d              ubrk_close_4_2

不知道这些信息是否有帮助。

编辑VolkerK的edit1 and edit2

我觉得有一点问题 - 系统上确实有另一个icu版本;至少部分(例如,没有其他icu-config;只有/usr/local/icu/bin中的那个)。

gcc -lpthread -lm -L/usr/local/icu/lib -licui18n -licuuc -licudata -lpthread -lm -licuio -print-file-name=libicuuc.so返回

/usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../lib64/libicuuc.so

gcc -lpthread -lm -L/usr/local/icu/lib -licui18n -licuuc -licudata -lpthread -lm -licuio -print-file-name=libicuuc.so.42返回

libicuuc.so.42

所以问题似乎是,如何将新的lib-path引入构建过程?顺便说一句,我从你的答案中学到了很多 - 谢谢你们所有人。

我还尝试编译你的简单测试程序 - 它也失败了同样的未定义引用错误,很可能是由于PHP无法编译的原因。

如何摆脱lib-path中对旧icu-library的引用,或者如何确定新icu-library-path的优先级?

3 个答案:

答案 0 :(得分:6)

答案 1 :(得分:0)

致电时

export LD_LIBRARY_PATH=/usr/local/icu/lib

然后您将覆盖当前设置的路径。所以它可能会找到ICU,但它找不到它需要的任何其他库。试试这个:

export LD_LIBRARY_PATH=/usr/local/icu/lib:${LD_LIBRARY_PATH}

如果这没有帮助,我可以想到两件事要尝试:

  1. 图书馆是否在正确的位置?也许你的安装在其他地方移动了,比如/usr/local/lib/icu而不是?
  2. ICU有效吗?尝试ICU的“make check”目标。尝试编译/运行ICU附带的测试套件,或尝试编译并运行一个简单的ICU示例。 This presentation (PPT)有一些简单的例子。
  3. 修改

    我想我明白了。它看起来像php-intl只适用于libicu 3.6或3.8。我已经搜索过Linux发行版php-intl并且它们都依赖于libicu 3.8,即使它们也发布了libicu 4.0或更高版本。 last changelog before intl became part of php itself表示相同。

    我建议安装libicu 3.8并再试一次。

答案 2 :(得分:0)

ld很有可能不知道在哪里找到这些库。您必须更新LD_LIBRARY_PATH(每次),或让ldconfig了解您的新库。

你可以:

  • 将其安装在/ usr / local / lib或/ usr / lib
  • 将其位置添加到/etc/ld.so.conf并重新运行/ sbin / ldconfig

现在,即使ldconfig是由安装了库的任何东西运行的,ldconfig也不知道它的位置,因为/ usr / local / icu / lib不在其范围内。如果库已安装到/ usr / local / lib / icu,ldconfig将知道在哪里找到它,并且您不必手动指定LD路径。

我建议在修改ld.so.conf之前将库重新安装到/ usr / local / lib并运行ldconfig,但是如果你想让它工作,那么修改那个文件并不是一个很好的禁忌。