目前我正在尝试在某些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的优先级?
答案 0 :(得分:6)
答案 1 :(得分:0)
致电时
export LD_LIBRARY_PATH=/usr/local/icu/lib
然后您将覆盖当前设置的路径。所以它可能会找到ICU,但它找不到它需要的任何其他库。试试这个:
export LD_LIBRARY_PATH=/usr/local/icu/lib:${LD_LIBRARY_PATH}
如果这没有帮助,我可以想到两件事要尝试:
/usr/local/lib/icu
而不是?修改强>
我想我明白了。它看起来像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了解您的新库。
你可以:
现在,即使ldconfig是由安装了库的任何东西运行的,ldconfig也不知道它的位置,因为/ usr / local / icu / lib不在其范围内。如果库已安装到/ usr / local / lib / icu,ldconfig将知道在哪里找到它,并且您不必手动指定LD路径。
我建议在修改ld.so.conf之前将库重新安装到/ usr / local / lib并运行ldconfig,但是如果你想让它工作,那么修改那个文件并不是一个很好的禁忌。