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.
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
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
.
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.
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!