سؤال

لدي مشكلة تتعلق 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

حصلت على هذه النصيحة الأخيرة من منتدى آخر ، لذا فإن الاعتمادات المستحقة حيث يعرض الاعتمادات!

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