【发布时间】:2010-11-07 21:11:49
【问题描述】:
目前我正在尝试在一些 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 选项)。但是当我编译 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库和各自的软链接都位于/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 的优先级?
【问题讨论】:
-
运行
ldconfig /usr/local/icu/lib有帮助吗? -
icu-config 的输出似乎是正确的。可惜 objdump -C 不起作用。 Afaik libicuuc.so 应该导出 ubrk_close ......也许你可以尝试不带参数?只是“objdump /usr/local/icu/lib/libicuuc.so.42.0.1”,它应该显示这个共享对象已经导出了哪些符号/函数。让我们坚持这个例子:只复制&粘贴 ubrk_close/ubrk_close_4_2 的条目。顺便说一句:您还没有在构建 ICU 和 PHP 之间切换编译器(或例如 gcc 的主要版本)?
-
在 VolkerK 发表评论后编辑问题。
-
您也可以在构建时尝试跟踪 open() 调用。这样你就可以看到打开了哪些文件。也许它会揭示构建过程期望 libicu 位于哪个位置。
-
@Sander Marechal:我该怎么做(“跟踪 open() 调用”)?尽管我设法构建了我尝试过的几乎所有软件(PHP 5.3 除外;-)
标签: php linux installation intl