سؤال

حاليا أنا أحاول تثبيت 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

وحدة العناية المركزة 4.2 يقع في /usr/local/icu و PHP 5.2.9 جمعت لا تشوبه شائبة (بدون الباحث - و العناية المركزة-الخيارات).ولكن عندما complie 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

لا يساعد.

أي شخص يمكن أن تشير لي إلى بعض الحلول ؟ أنا بالأحرى جاهل - و أنا لست خبير حقيقي في هذه الأمور...

تحرير:

أنا فقط إعادة الفحص والتأكد من أن مختلف العناية المركزة-المكتبات المعنية لينة الروابط كلها تقع في /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 هو الأسئلة

أنا ركبت العناية المركزة 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 و edit2:

أعتقد أن هناك فرك - هناك في الواقع آخر وحدة العناية المركزة-الإصدار على sytem;على الأقل في أجزاء (لا يوجد غيرها العناية المركزة-التكوين على سبيل المثال ؛ فقط واحد في /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-الطريق إلى بناء العملية??بالمناسبة, لقد تعلمت الكثير من الإجابات الخاصة بك - شكرا لكم جميعا.

أنا أيضا حاولت تجميع اختبار بسيط البرنامج - كما فشل مع نفس إشارة غير محددة خطأ على الأرجح بسبب نفس السبب PHP لن ترجمة.

كيف يمكنني التخلص من الإشارة إلى القديم العناية المركزة-مكتبة lib-مسار أو كيف يمكنني تحديد أولويات جديدة icu-مكتبة-الطريق ؟

هل كانت مفيدة؟

المحلول

المشكلة يبدو أن الثنائية يرتبط ضد الخطأ (مشترك) مكتبة الملفات.
أول طويلة مملة كسبلايناتيون ما أعتقد المشكلة.نضع في اعتبارنا أن أنا لست لينكس الخبراء.أنا حقا أريد منك أن تفهم القطار من الأفكار بحيث يمكنك أن تقرر ما إذا كان ممكنا و/أو أين أنا على خطأ.
الأولى (الخام) الحل هو عكسها بسهولة.تشغيل آخر ./تكوين كافة التغييرات هي التاريخ.أعتقد أن الأمر حفظ.

لماذا يجب العناية المركزة 4-2 محددة تبعيات في المقام الأول ؟ دعونا نلقي نظرة على الملف المصدر من php الى امتداد (ext/intl/رسمه/grapheme_string.ج)

#include <unicode/ubrk.h>
...
PHP_FUNCTION(grapheme_substr)
{
   ...
   ubrk_close(bi);
   ...

حتى الآن لا يوجد نسخة كود معين.grapheme_string.ج تبدو هي نفسها إذا كنت تستخدم وحدة العناية المركزة 3.4 أو icu 4.2.أين ubrk_close_4_2 تأتي من ؟
عند تشغيل "./تكوين ...--مع-العناية المركزة-dir=/البيرة/المحلية/icu" قيادة الملف ext/intl/config.m4 يتم تنفيذها.في هذه العملية العناية المركزة-التكوين يسمى للحصول على تضمين المسار مكتبة الملفات المطلوبة لبناء php.قدمت لك الطريق إلى وحدة العناية المركزة التثبيت الذي يتلخص في أن

ICU_CONFIG="$PHP_ICU_DIR/bin/icu-config"
ICU_INCS=`$ICU_CONFIG --cppflags-searchpath`
ICU_LIBS=`$ICU_CONFIG --ldflags --ldflags-icuio`

يتم تنفيذ.كنت قد حاولت العناية المركزة-config نفسك حتى تعرف ما المخرجات وبالتالي ما ICU_INCS و ICU_LIBS تحتوي على.ICU_INCS و ICU_LIBS يتم تمريرها إلى دول مجلس التعاون الخليجي عندما يتم تجميع الملفات/ربط.دول مجلس التعاون الخليجي (apperently) لم تجد unicode/ubrk.ح في الدليل الافتراضي ، لذلك بحثت عن الملف في إضافية تشمل الدلائل التي قدمتها ICU_INCS حيث وجدت العناية المركزة 4.2 تشمل الملفات.يونيكود/ubrk.ح يشمل unicode/utypes.ساعة ثم الذي يشمل unicode/urename.ح - ومرة أخرى في العناية المركزة 4.2 رأس الملفات المدرجة.في هذه الحالة unicode/urename.ح يشمل تعريف #ubrk_close ubrk_close_4_2.
عندما preprocessor يتم ubrk_close(bi) تم استبدال ubrk_close_4_2(bi).

PHP_FUNCTION(grapheme_substr)
{
   ...
   ubrk_close_4_2(bi);
   ...

الآن لديك نسخة محددة التبعية ، في إشارة إلى ubrk_close_4_2 أن بعض المكتبات قد حل.
بحيث تشمل جزء لم يعمل.هذا الواقع لم تجد العناية المركزة 4.2 النسخة المستخدمة به رأس الملفات.حتى الآن جيد جدا.
الآن رابط الجزء.في حالة ICU_LIBS يحتوي على

-lpthread -lm -L/usr/local/icu/lib -licui18n -licuuc -licudata -lpthread -lm -licuio

-licuuc يقول دول مجلس التعاون الخليجي "تجد لي مكتبة يسمى 'icuuc' واستخدامها".دول مجلس التعاون الخليجي ثم يبحث ليب مسارات الملفات مع بعض نظام التسمية التي تتطابق مع "icuuc".
في هذه الحالة libicuuc.لذلك.لاحظ أنه لا يبدو للحصول على إصدار محدد اسم الملف فقط libicuuc.لذلك.مرة واحدة وقد وجدت هذا الملف لن ابحث عن واحد آخر.الخليجي الأول البحث في المسارات الافتراضية.ثم يبحث في مكتبة إضافية مسارات - في المقدمة دول مجلس التعاون الخليجي.أولا-هاء.

دول مجلس التعاون الخليجي -L/usr/lib -L/usr/local/lib -licuuc

سوف تجد /usr/lib/libicuuc.حتى إذا كان هناك مثل هذا الملف وليس /usr/local/lib/libicuuc.حتى (بعد الآن).بمعنى أنه إما المسار الافتراضي أو ترتيب المكتبة مسار توجيهات قد يكون سبب مشكلتك.
عندما الخاص بك برنامج يرتبط ضد الكائنات المشتركة "خاصة" محمل يضاف إلى رمز واسم مشترك تخزين الكائن في برنامج (في وقت الارتباط).
في كل مرة يتم تنفيذ برنامج, أولا (وقت التشغيل) محمل يبحث عن الكائن المشتركة (من اسمها), تحميل رمز يستبدل بعض كعب القفز عناوين.
الكائن المشتركة استطيع "قل" رابط (أيفي وقت الارتباط) اسم مشترك كائن محمل يجب أن نبحث عن (SONAME الملكية) في وقت التشغيل.نلقي نظرة على قائمة الدليل الذي قدمته في سؤالك النص

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

libicuuc.لذلك هذا الملف دول مجلس التعاون الخليجي تبحث عن عندما -licuuc يتم توفيرها.رابط يتبع الارتباط الرمزي و يستخدم libicuuc.لذلك.42.0.1.هذا الملف "يقول" linker أن (وقت التشغيل) محمل ينبغي أن ننظر libicuuc.لذلك.42 انظر http://userguide.icu-project.org/packaging#TOC-ICU-Versions.
محمل سوف اتبع الارتباط الرمزي و تحميل libicuuc.لذلك.42.0.1, أو إذا كان هناك خلل libicuuc.لذلك.42.0.2, libicuuc.لذلك.42.0.3 مهما libicuuc.لذلك.42 يشير إلى.libicuuc.لذلك.42/يجب دائما نقطة الفعلي الكائن المشترك أن الصادرات العناية المركزة 4.2 الرموز.قد يكون رمز تغيير/إصلاح ولكن تصدير الرموز تبقى نفسها.المشكلة الآن هو أن دول مجلس التعاون الخليجي لا تجد libicuuc.لذلك->libicuuc.لذلك.42.0.1 ولكن (دعنا نقول) libicuuc.لذلك->libicuuc.لذلك.34.x.y.هذا libicuuc.لذلك.34.x.y لا تصدير العناية المركزة 4.2 الرموز لا توفر ubrk_close_4_2 ولكن ubrk_close_3_4.لذا لا ubrk_close_4_2 -> لم تحل إشارة الخطأ.

الأولى "الحل" (الخام):السماح ./تكوين تفعل سحرها ثم ...فقط تحرير Makefile.
فتح Makefile (في المصدر الأعلى الدليل) في محرر النص, البحث عن INTL_SHARED_LIBADD= واستبدال

-licui18n -licuuc -licudata -licuio

في هذا الخط من قبل

/usr/local/icu/lib/libicui18n.لذلك.42 /usr/local/icu/lib/libicuuc.لذلك.42 /usr/local/icu/lib/libicudata.لذلك.42 /usr/local/icu/lib/libicuio.لذلك.42

(ترك أي -lm-pthread ...كما هي).تجميع مرة أخرى.
هذا "يقول" دول مجلس التعاون الخليجي/رابط لا إلى البحث عن .حتى الملفات ولكن استخدام تلك المحددة.يجب أن تكون النتيجة نفسها إذا كانت المكتبة الخاصة بك المسار العامل (نتيجة من SONAME).
ولكن في كل مرة تقوم بتشغيل ./تكوين عليك أن تطبيق "الإصلاح" مرة أخرى.

الحل الثاني:إزالة أخرى libicuXY.حتى روابط الرمزية (التي فيها كلمة "النسخ الاحتياطي" يتبادر إلى الذهن), تبقي فقط على libicuXY.لذلك->libicuXY.لذلك.42.0.1 الروابط.إذا لا يوجد libicuuc.لذلك->>libicuuc.لذلك.34.x.y الروابط مجلس التعاون الخليجي/رابط لا يمكن العثور عليها ولن رابط ضد الإصدارات القديمة.
مرة أخرى بسبب SONAME الملكية الثنائيات التي تم ربطها ضد النسخة القديمة سوف لا تزال تعمل لأن "على" محمل البحث عن (لا تزال موجودة) libicuXY.لذلك.34 الملفات.
هذا سوف يؤثر على جميع اللاحقة رابط يعمل ، أيإذا كنت بناء مشروع آخر يستخدم كبار السن تشمل ملفات واجهت نفس المشكلة بطريقة أخرى.رأس الملفات الكائنات المشتركة (في وقت الارتباط) يجب أن تتطابق.

نصائح أخرى

هناك فرصة جيدة أن ld لا أعرف من أين للعثور على تلك المكتبات.سيكون لديك إما تحديث LD_LIBRARY_PATH (في كل مرة) ، أو قد ldconfig تعلم من المكتبة الجديدة.

يمكنك إما:

  • تثبيته في /usr/local/lib أو /usr/lib
  • إضافة الموقع إلى /etc/ld.لذلك.conf وإعادة تشغيل /sbin/ldconfig

الآن حتى لو ldconfig كان يديرها مهما تثبيت المكتبة ، ldconfig ليس لديهم فكرة عن الموقع بسبب /usr/local/icu/lib ليس في نطاقه.إذا كانت المكتبة تثبيت /usr/local/lib/وحدة العناية المركزة ، ldconfig أن أعرف أين يمكن العثور عليه, و سوف لا يكون لديك تحديد هوية المسار يدويا.

أوصي فقط إعادة تثبيت المكتبة إلى /usr/local/lib و تشغيل ldconfig قبل تعديل دينار.لذلك.conf, ومع ذلك تعديل هذا الملف ليس كبير المحرمات إذا كنت ترغب فقط في الحصول على عمل.

عند استدعاء

export LD_LIBRARY_PATH=/usr/local/icu/lib

ثم أنت الكتابة حاليا تعيين المسار.لذلك يمكن أن تجد العناية المركزة لكنها لن تجد أي من المكتبات الأخرى التي يحتاجها.جرب هذا بدلا من ذلك:

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

أنا لا أستطيع التفكير في أمرين في محاولة:

  1. هو مكتبة في المكان الصحيح ؟ ربما التثبيت انتقلت للعيش في مكان آخر ، /usr/local/lib/icu بدلا من ذلك ؟
  2. هل العناية المركزة العمل ؟ محاولة جعل "تحقق" الهدف العناية المركزة.حاول تجميع/تشغيل اختبار جناح المضمنة مع وحدة العناية المركزة ، أو محاولة تجميع وتشغيل تافهة العناية المركزة سبيل المثال. هذا عرض تقديمي (PPT) وقد قليلة تافهة الأمثلة.

تحرير

أعتقد أنني اكتشفت ذلك.يبدو php-intl يعمل فقط مع libicu 3.6 أو 3.8.كنت قد بحثت من أي وقت مضى توزيعة لينكس الشحن php-intl وكلهم يعتمد على libicu 3.8 حتى عندما يتم الشحن أيضا libicu 4.0 أو في وقت لاحق.على آخر التغيير قبل intl أصبحت جزءا من php نفسها يشير إلى نفسه.

أقترح تثبيت libicu 3.8 و المحاولة مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top