web-dev-qa-db-fra.com

GLIBCXX_3.4.9 introuvable

J'ai un problème concernant libstdc++.so.

J'ai installé une nouvelle version de gcc et essayé de compiler du code C++. La compilation a fonctionné, mais lorsque j'essaie d'exécuter le binaire (m5.opt est son nom) J'ai l'erreur suivante:

build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).

Dois-je remplacer libstdc++.so? Et si oui, où puis-je télécharger la version que je veux? Sur le site Web de GCC, ils disent que libstdc ++ fait maintenant partie de gcc.

Détails

GCC: J'avais gcc 4.1.2 auparavant, mais j'ai téléchargé gcc 4.2.4. A partir du répertoire gcc non marqué, j'ai exécuté ./configure; faire; Sudo make install`. Quand j'ai essayé d'utiliser gcc ou g ++ pour compiler, sa version par défaut était toujours 4.1.2. Pour surmonter cela, j'ai remplacé certains liens:

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

Version Linux: uname -a donne:

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

22
Maximilien

Le problème est que vous avez mal construit votre nouveau GCC: sous Linux, vous devez utiliser

./configure --prefix=/usr

Le préfixe d'installation par défaut est /usr/local, c'est pourquoi make install mettre gcc et g++ binaires dans /usr/local/bin, etc.

Ce qui vous arrive maintenant, c'est que vous compilez et liez à l'aide du nouveau (lien symbolique) GCC 4.2.4, mais à l'exécution, votre programme se lie à l'ancien /usr/lib64/libstdc++.so.6 (version 6.0.8, au lieu de 6.0.9 requis). Vous pouvez confirmer qu'en exécutant ldd build/ALPHA_SE/m5.opt: vous devriez voir qu'il utilise /usr/lib64/libstdc++.so.6.

Vous pouvez effectuer plusieurs corrections.

env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt

devrait vous montrer que le réglage LD_LIBRARY_PATH est suffisant pour rediriger le binaire vers la bibliothèque correcte, et

LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt

devrait simplement fonctionner. Vous pouvez "cuire" ce chemin dans le binaire m5.opt en le reliant avec -Wl,-rpath=/usr/local/lib64.

Une solution plus permanente consiste à corriger les bibliothèques de la même manière que vous avez fixé les binaires:

cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .

Une solution encore meilleure consiste à reconfigurer le nouveau GCC avec --prefix=/usr, puis make all install.

26
Employed Russian

Je sais que c'est une très vieille question, mais ...

Ce n'est généralement pas une bonne idée de remplacer le compilateur système (c'est-à-dire celui dans /usr) car tout le système aura été construit avec lui et en dépendra.

Il est généralement préférable d'installer le nouveau compilateur dans un emplacement séparé, puis de consulter le libstdc ++ FAQ Comment puis-je m'assurer que la bibliothèque liée dynamiquement sera trouvée? et - Recherche de bibliothèques dynamiques ou partagées dans le manuel pour savoir comment s'assurer que libstdc ++ est correct lors de l'exécution.

8
Jonathan Wakely

Les autres réponses ici devraient être correctes, mais la solution "rapide et facile" si vous avez installé gcc dans/usr/local/consiste simplement à ajouter les nouvelles bibliothèques à LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

Vous pouvez également vérifier le pour voir si vous avez installé les bonnes versions de GLIBC en utilisant

strings /usr/lib/libstdc++.so.6 | grep GLIBC
strings /usr/local/lib64/libstdc++.so.18 | grep GLIBC

J'ai reçu ce dernier conseil d'un autre forum, donc les crédits sont dus là où les crédits sont dus!

5
Colin D