GLIBCXX_3.4.9 غير موجود
سؤال
لدي مشكلة تتعلق libstdc++.so
.
لقد قمت بتثبيت إصدار جديد من GCC وحاولت تجميع كود C ++. عمل التجميع ، لكن عندما أحاول تنفيذ الثنائي (m5.opt
هو اسمه) لقد حصلت على الخطأ التالي:
build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).
هل أحتاج إلى استبدال libstdc++.so
؟ وإذا كان الأمر كذلك ، فأين يمكنني تنزيل الإصدار الذي أريده؟ على GCC-Website يقولون إن libstdc ++ هو جزء من GCC الآن.
تفاصيل
GCC: كان لدي GCC 4.1.2 من قبل ، لكنني قمت بتنزيل GCC 4.2.4. من دليل GCC-Directory الذي قمت بإعدامه ./configure
; ؛ صنع؛ Sudo جعل التثبيت. عندما حاولت استخدام GCC أو G ++ للتجميع ، كان الإصدار الافتراضي لا يزال 4.1.2. للتغلب على هذا ، استبدلت بعض الروابط:
mv /usr/bin/gcc /usr/bin/gcc_bak
ln -s /usr/local/bin/gcc gcc
mv /usr/bin/g++ /usr/bin/g++_bak
ln -s /usr/local/bin/g++ g++
GLIBC (++) - LIBSTDC ++:
/usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.8
/usr/local/lib/libstdc++.so -> libstdc++.so.6.0.9
/lib/libc.so.6 -> libc-2.5.so -> libc-2.5.so
Linux-version:uname -a
يعطي:
Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
المحلول
المشكلة هي أنك بنيت الجديد الخاص بك GCC
بشكل غير صحيح: على Linux يجب استخدامك
./configure --prefix=/usr
بادئة التثبيت الافتراضية هي /usr/local
, ، وهذا هو السبب make install
وضع gcc
و g++
الثنائيات في /usr/local/bin
, ، إلخ.
ما يحدث لك الآن هو أن تقوم بتجميع وربط باستخدام الجديد (symlinked) GCC 4.2.4
, ، ولكن في وقت التشغيل ، يرتبط برنامجك بالقديم /usr/lib64/libstdc++.so.6
(الإصدار 6.0.8 ، بدلاً من 6.0.9). يمكنك تأكيد ذلك عن طريق الجري ldd build/ALPHA_SE/m5.opt
: يجب أن ترى أنه يستخدم /usr/lib64/libstdc++.so.6
.
هناك العديد من الإصلاحات التي يمكنك القيام بها.
env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt
يجب أن تظهر لك هذا الإعداد LD_LIBRARY_PATH
يكفي لإعادة توجيه الثنائي لتصحيح المكتبة ، و
LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt
يجب أن يركض فقط. يمكنك "خبز" هذا المسار إلى M5.OPT ثنائي عن طريق إعادة النظر فيه مع -Wl,-rpath=/usr/local/lib64
.
الحل الأكثر دائمة هو إصلاح المكتبات بنفس الطريقة التي قمت بإصلاحها الثنائيات:
cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .
الحل الأفضل هو إعادة تكوين الجديد GCC
مع --prefix=/usr
, ، وثم make all install
.
نصائح أخرى
أعلم أن هذا سؤال قديم للغاية ، لكن ...
ليس من الجيد عادة استبدال برنامج التحويل البرمجي (أي واحد في /usr
) لأن النظام بأكمله سيتم بناؤه معه ويعتمد عليه.
عادة ما يكون من الأفضل تثبيت برنامج التحويل البرمجي الجديد على موقع منفصل ثم رؤية الأسئلة الشائعة LIBSTDC ++ كيف أؤمن أن المكتبة المرتبطة ديناميكيًا ستجد؟ و العثور على المكتبات الديناميكية أو المشتركة في الدليل لكيفية ضمان LIBSTDC ++ الصحيح. يوجد في وقت التشغيل.
يجب أن تكون الإجابات الأخرى هنا على ما يرام ، ولكن الحل "السريع والسهل" إذا حدث تثبيت GCC على/usr/local/هو مجرد إضافة libs الجديدة إلى ld_library_path
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
يمكنك أيضًا التحقق من لمعرفة ما إذا كان لديك الإصدارات الصحيحة من GLIBC مثبتة باستخدام
strings /usr/lib/libstdc++.so.6 | grep GLIBC
strings /usr/local/lib64/libstdc++.so.18 | grep GLIBC
حصلت على هذه النصيحة الأخيرة من منتدى آخر ، لذا فإن الاعتمادات المستحقة حيث يعرض الاعتمادات!