/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15 'introuvable

135

Comment puis-je obtenir GLIBCXX_3.4.15 dans Ubuntu? Je ne peux pas exécuter certains programmes que je compile.

Quand je fais:

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

Je reçois:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

Merci pour toute aide!

Chris
la source

Réponses:

81

Je compile gcc 4.6 à partir des sources, et apparemment

sudo make install 

n'a pas attrapé celui-ci. J'ai creusé et trouvé

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

Je l'ai copié dans / usr / lib et redirigé libstdc ++. So.6 pour pointer vers le nouveau, et maintenant tout fonctionne.

Chris
la source
1
J'ai le même problème, et ce message / réponse est exactement ce que je recherche. Merci beaucoup!
yoco
1
Cela fonctionne également avec gcc 4.6.2 sauf que c'est libstdc ++. So.6.0.16. Merci!
Venesectrix
2
Le mien est gcc 4.7 et libstdc ++. So.6.0.17. Avait le même problème, corrigé avec cette solution. Gloire.
Ricbit
1
Oui il y a. Une apt-getsolution basée sur ce problème est décrite ici: superuser.com/questions/310809/…
aroth
4
@roosevelt: ce n'est pas un problème avec le système d'exploitation, c'est un problème avec les utilisateurs installant eux-mêmes le logiciel et n'utilisant pas correctement l'éditeur de liens. C'est une FAQ: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
54

J'ai évité ce problème dans le passé en liant simplement libstdc ++ statiquement avec ce paramètre envoyé à g ++ lors de la liaison de mon exécutable:

-static-libstdc++

Si la liaison statique dans la bibliothèque est une option, c'est probablement la solution la plus rapide.

Martin G
la source
2
Merci beaucoup, j'ai essayé toutes les autres solutions proposées sur SO et rien n'a fonctionné à part celle-ci.
Itamar Katz
1
Merci pour votre solution, cela m'aide beaucoup!
Brightshine
Le problème est que la bibliothèque est introuvable, pas que vous devez établir un lien statique. Voir la réponse de @Hobo.
Dan Mergens
45

J'essayais de me mettre au travail (ce qui nécessite également la version 6.0.15), et en fouinant, j'ai trouvé qu'il était installé à /usr/local/lib/libstdc++.so.6.0.15. Il s'est installé là-bas lorsque j'ai installé graphite (une version expérimentale de gcc).

Si vous avez besoin d'accéder aux bibliothèques à cet emplacement, vous devrez définir LD_LIBRARY_PATHcomme:

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

J'ai pu me mettre au travail après avoir fait cela. J'espère que cela est utile à quelqu'un.

Clochard
la source
Je travaillais sur une cible embarquée et j'ai le même problème, votre solution semble ne pas fonctionner dans mon cas. En fait, la plupart des binaires de la cible utilisent la bibliothèque c par défaut dans / lib, donc le changement LD_LIBRARY_PATHles affectera. ils seront tous liés à la nouvelle bibliothèque, à la fin la plupart des binaires ne fonctionnent pas: tels que ls grep, ....: je reçois:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin
14

Je rencontre ce problème en essayant d'utiliser matlab eng pour appeler des fonctions m à partir du code C. qui se produit avec la commandemex -f .. ..

Ma solution:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

J'ai trouvé qu'il comprend 3.4.15

donc mon système a les dernières bibliothèques.

le problème vient de matlab lui-même, il appelle sa propre libstdc ++. so.6 de {MATLAB}/bin

donc, remplacez-le simplement par la bibliothèque système mise à jour.

Cheng Chang
la source
Cela semble aussi fonctionner pour moi dans Matlab 2013b x64 sur Xubuntu 13.04 x64
Marcin
Merci beaucoup. Je devais juste créer un nouveau lien symbolique pour le fichier dans {MATLAB}/binle fichier dans /usr/lib/, puis redémarrer matlab. Cela fonctionne dans Matlab 2010b sur Fedora 14 x64.
Wok
2

J'ai eu la même erreur. Voici comment cela a fonctionné pour moi:

  • nettoyé le projet sous gcc actuellement installé
  • recompilé

A parfaitement fonctionné!

iueae
la source
2

Pour cette erreur, j'ai copié la dernière version de libstdc ++. So.6.0.17 d'un autre serveur, j'ai supprimé le lien logiciel et l'ai recréé.

1. Copiez le fichier libstdc ++. So.6.0.15 ou plus récent d'un autre serveur sur le système concerné.
Dans mon cas, SUSE linux 11 SP3 avait le dernier.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (sous le répertoire / usr / lib64).

nJoy

crazyLinux
la source
2

Je viens de faire face à un problème similaire lors de la construction de la version 3.7 de LLVM. vérifiez d'abord si vous avez installé la bibliothèque requise sur votre système:

$locate libstdc++.so.6.*

Ajoutez ensuite l'emplacement trouvé à votre variable d'environnement $ LD_LIBRARY_PATH.

Arsen
la source
2
Cela ne fonctionne que si vous avez une libstdc ++. So.6. * Avec le support
GLIBCXX_3.4.15
2

Parfois, vous ne contrôlez pas la machine cible (par exemple, votre bibliothèque doit fonctionner sur un système d'entreprise verrouillé). Dans ce cas, vous devrez recompiler votre code en utilisant la version de GCC qui correspond à leur version GLIBCXX. Dans ce cas, vous pouvez effectuer les opérations suivantes:

  1. Recherchez la dernière version de GLIBCXX prise en charge par la machine cible: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Supposons que la version soit 3.4.19.
  2. Utilisez https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html pour trouver la version GCC correspondante. Dans notre cas, c'est [4.8.3, 4.9.0).
Gili
la source
1

gcc version 4.8.1, l'erreur ressemble à:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15 'introuvable (requis par / root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

J'ai trouvé le libstdc ++. So.6.0.18 à l'endroit où je me suis conformé à gcc 4.8.1

Alors j'aime ça

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

problème résolu.

Favoorr
la source
1

Je les ai extraits d'un RPM ( RPM pour libstdc ++ ) puis:

export LD_LIBRARY_PATH=.

Pour que le système recherche les bibliothèques dans le répertoire courant. Puis vient d'exécuter mon programme. Mais dans mon cas, j'ai reçu un seul exécutable dont j'avais besoin, ce n'était pas un changement à l'échelle du système.

prmottajr
la source
0

J'ai eu un problème similaire, et je l'ai résolu en reliant statiquement libstdc++le programme que je compilais, comme ceci:

$ LIBS=-lstdc++ ./configure ... etc.

au lieu de l'habituel

$ ./configure ... etc.

Il peut y avoir des problèmes avec cette solution liés au chargement des bibliothèques partagées au moment de l'exécution, mais je n'ai pas suffisamment examiné le problème pour commenter.

Evgeni Sergeev
la source
0

J'ai eu le même problème car j'ai changé l'utilisateur de moi-même à quelqu'un d'autre:

su

Pour une raison quelconque, après la compilation normale, je n'ai pas pu l'exécuter (le même message d'erreur). Directement ssh à l'autre compte utilisateur fonctionne.

Bonjour le monde
la source
Cela ne répond pas vraiment à la question. Si vous avez une autre question, vous pouvez la poser en cliquant sur Poser une question . Vous pouvez également ajouter une prime pour attirer davantage l'attention sur cette question.
ravron le
Non, car j'ai eu exactement le même problème. Cela a été causé par un changement d'utilisateur. Cela aurait pu aussi arriver à quelqu'un d'autre, disons changer en root.
HelloWorld
Mon erreur! J'ai été renversé par la première ligne, qui semblait que vous aviez également le problème. Continuer!
ravron
J'ai également utilisé Ubuntu et j'ai également essayé de compiler des programmes et j'ai également reçu le même message d'erreur que dans la question. Mon erreur était que je le faisais dans un autre compte utilisateur en utilisant la commande su. Je pense que cela répond à la question car il traite du pourquoi et du comment du problème. C'est certainement une possibilité.
HelloWorld
Et un utilisateur avait défini LD_LIBRARY_PATH pour trouver la nouvelle bibliothèque mais pas l'autre utilisateur? Cela semble un peu tiré par les cheveux dans le contexte spécifique de cette question.
Marc Glisse
0

J'avais plusieurs versions du compilateur gcc installées et j'avais besoin d'utiliser une version plus récente que l'installation par défaut. Puisque je ne suis pas un administrateur système pour nos systèmes Linux, je ne peux pas simplement changer / usr / lib ou plusieurs des autres suggestions ci-dessus. Je rencontrais ce problème et je l'ai finalement suivi pour définir mon chemin vers le répertoire de la bibliothèque 32 bits au lieu du répertoire de la bibliothèque 64 bits (lib64). Comme les bibliothèques du répertoire 32 bits étaient incompatibles, le système est passé par défaut à l'ancienne version qui était obsolète.

L'utilisation de -L vers le chemin auquel je faisais référence a donné des avertissements sur le fait de "sauter la libstdc ++ incompatible. Donc lors de la recherche de -lstdc ++". C'était l'indice qui m'a finalement aidé à résoudre le problème.

Cathy
la source
0

Même chose avec la version gcc 4.8.1 (GCC)et libstdc++.so.6.0.18. J'ai dû le copier ici /usr/lib/x86_64-linux-gnusur ma boîte ubuntu.

ervinbosenbacher
la source
0

Dans mon cas, LD_LIBRARY_PATH avait / usr / lib64 avant / usr / local / lib64. (J'étais en train de construire llvm 3.9).
Le nouveau compilateur gcc que j'ai installé pour compiler llvm 3.9 avait des bibliothèques utilisant des bibliothèques GLIBCXX plus récentes sous / usr / local / lib64 J'ai donc corrigé LD_LIBRARY_PATH pour que l'éditeur de liens voie d'abord / usr / local / lib64.
Cela a résolu ce problème.

Chan Kim
la source
0

Je viens d'utiliser -static-libstdc ++ lors de la construction. avec ça, je peux exécuter le a.out

g++ test.cpp -static-libstdc++
Suresh
la source
0

À des fins de test:

Sur la machine d'origine, recherchez la bibliothèque, copiez dans le même répertoire que l'exécutable:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

Copiez ensuite cette même bibliothèque sur la machine cible et exécutez l'exécutable:

LD_LIBRARY_PATH=. ./myexecutable

Remarque: la commande ci-dessus est temporaire; ce n'est pas un changement à l'échelle du système.

Contango
la source