1
6
问题似乎是二进制文件链接到了错误的(共享)库文件。
首先,为什么您有icu 4-2特定的依赖关系?让我们来看看PHP的Itl扩展的源文件(Ext/ItL/GraceMe/GrimeEythStudio.c)
到目前为止,还没有特定于版本的代码。无论使用ICU3.4还是ICU4.2,grapheme_string.c看起来都是一样的。ubrk_close_4_2从哪里来?
被执行。您自己已经尝试过icu配置,因此您知道它输出什么,以及icu INCS和icu LIBS包含什么。
在编译/链接文件时,ICU增量和ICU库被传递给gcc。gcc(显然)在其默认目录中没有找到unicode/ubrk.h,因此它在ICU_INCS提供的其他包含目录中搜索该文件,在该目录中找到了ICU 4.2包含文件。
unicode/ubrk.h包括unicode/utypes.h,其中包括unicode/urename.h,并且同样包括ICU4.2头文件。在本例中,unicode/urename.h包括#define ubrk_close ubrk_close ubrk_close_4_2。
现在,您有了一个特定于版本的依赖项,一个对ubrk_close_4_2的引用,一些库必须解析它。
-licuuc告诉gcc“找到一个名为‘icuuc’的库并使用它”。gcc然后在库路径中搜索具有与“icuuc”匹配的特定命名方案的文件。
gcc-L/usr/lib-L/usr/local/lib-licuuc
如果有这样一个文件而不是/usr/local/lib/libicuuc.so(不再),则将查找/usr/lib/libicuuc.so。这意味着,默认路径或库路径指令的顺序可能是导致问题的原因。
libicuuc.so,这就是gcc在提供-licuuc时要查找的文件。链接器遵循符号链接并使用libicuuc.so.42.0.1。此文件“告诉”链接器(运行时)加载程序应查找libicuuc.so.42,请参阅
http://userguide.icu-project.org/packaging#TOC-ICU-Versions
.
第一个“解决方案”(原始):让/configure发挥它的魔力,然后。。。只需编辑Makefile。
-licui18n-licuuc-licudata-licuio 在那一行
(保留任何-lm-pthread…不变)。重新编译。
第二种解决方案:删除其他libicuXY.so符号链接(这就是“备份”一词的由来),只保留libicuXY.so->libicuXY.so.42.0.1链接。如果没有其他libicuuc.so->&燃气轮机;libicuuc.so.34.x.y链接gcc/链接器找不到它们,也不会链接到旧版本。
|
2
0
您可以:
现在,即使ldconfig由库中安装的任何程序运行,ldconfig也不知道它的位置,因为/usr/local/icu/lib不在它的范围内。如果库被安装到/usr/local/lib/icu,ldconfig将知道在哪里可以找到它,并且您不必手动指定LD路径。 我建议在修改ld.so.conf之前,将库重新安装到/usr/local/lib并运行ldconfig,但是如果您只是想让它工作,那么修改该文件并不是什么大禁忌。 |
3
0
当你打电话的时候
然后您将覆盖当前设置的路径。所以它可能会找到ICU,但找不到它需要的任何其他图书馆。请尝试以下方法:
如果这没有帮助,我可以想出两件事来尝试:
last changelog before intl became part of php itself 表示相同。 我建议安装libicu3.8并重试。 |