web-dev-qa-db-fra.com

Comment résoudre ce problème: /usr/lib/libstdc++.so.6: version "GLIBCXX_3.4.15" introuvable

Donc, je suis maintenant désespéré pour trouver une solution à ce problème. Je compile une bibliothèque partagée .so sous Ubuntu 32 bits (je l’ai déjà essayé sous Debian et Ubuntu 64 bits, mais aucun n’a fonctionné non plus)

Je continue à obtenir: /usr/lib/libstdc++.so.6: version ``GLIBCXX_3.4.15' not found chaque fois que j'essaye de charger mon plugin.

Voici comment je reçois cette erreur:

  1. Installer la dernière version 32 bits d'Ubuntu
  2. Sudo apt-get install build-essential
  3. Compiler et charger mon plugin (.so)

Voici quelques liens que j'ai trouvés et essayés, mais aucun n'a fonctionné pour moi:

(Ma vieille question: quelque part, je l’ai corrigée quelques jours après avoir posté cette question, mais je ne me souviens plus comment je l’ai fait exactement) 

Ma question

Un autre utilisateur avec le même problème

Et un autre

Je vois que certaines personnes ont résolu le problème en déplaçant libstdc ++ (je pense) dans un répertoire, puis en pointant ou en reliant idk à ce répertoire, mais cela me laissait perplexe.

Quelqu'un sait un correctif?

(Edit:) - Running: strings /usr/lib/libstdc++.so.6 | grep GLIBC in terminal me donne: strings '/usr/lib/libstdc++.so.6': No such file. Est-ce que cela pourrait être le problème? Et si oui, comment puis-je installer cette bibliothèque?

(Edit2 :) Quelqu'un d'autre connaît une solution?

(Edit3) Encore besoin d'une solution. Existe-t-il un moyen de voir sur quelle distribution une bibliothèque partagée a été compilée? Je sais que j'ai déjà compilé cette bibliothèque il y a quelque temps, mais je ne m'en souviens pas !!

(Edit4) ldd my_lib_.so me donne:

    linux-gate.so.1 =>  (0xb77d7000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76c1000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74ce000)
    /lib/ld-linux.so.2 (0xb77d8000)

ldd program_im_loading_so_into me donne:

    linux-gate.so.1 =>  (0xb77d8000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb77c0000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb77a5000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76bb000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb768f000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7672000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74c9000)
    /lib/ld-linux.so.2 (0xb77d9000)

courir strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep GLIBCXX me donne:

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
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

et enfin voici ma version gcc:

`gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)`
51
user1667191

Liez-vous statiquement à libstdc ++ avec l'option -static-libstdc++ gcc.

36
kerim

J'ai résolu ce problème en installant: Sudo apt-get install libstdc++6

Dans mon cas, j'ai rencontré ce problème après l'installation de MongoDB 3.0.1.

mongo: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version «GLIBCXX_3.4.18» introuvable (requis par mongo)

6
Shubhamoy

Il suffit d'installer la dernière version à partir du référentiel Nondefault:

$ Sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ Sudo apt-get update
$ Sudo apt-get install libstdc++6-4.7-dev
5
luart

ce problème peut être résolu en installant la dernière version de libstdc ++.

$ Sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ Sudo apt-get update
$ Sudo apt-get install libstdc++6-7-dbg
4
weiyixie

En haut, vous mentionnez que vous avez compilé dans le cadre de vos étapes pour reproduire, mais en dessous vous avez fait une modification, 

"Y at-il un moyen de voir sur quelle distribution une bibliothèque partagée a été compilée?"

Que vous ayez ou non compilé cela sur la même distribution, et même une version différente de la même distribution est un détail important, en particulier pour les applications c ++.

Les liens vers les bibliothèques c ++, y compris libstdc ++, peuvent avoir des résultats mitigés, pour autant que je sache. Voici une question connexe sur la recompilation avec différentes versions de c ++.

avons-nous besoin de recompiler des bibliothèques avec c ++ 11?

Fondamentalement, si vous avez compilé avec c ++ sur une distribution différente (et éventuellement une version différente de gcc), cela peut être la cause de votre problème.

Je pense que vous avez deux options:

  1. Votre meilleur pari - recompilez votre .so si vous ne l'aviez pas compilé sur votre système actuel. S'il y a un problème avec l'environnement système de votre environnement d'exécution, il peut même apparaître dans la compilation.
  2. Regroupez les autres bibliothèques c ++ de votre compilateur avec votre application. Cela ne peut être viable que si c'est la même distribution ... Mais c'est une astuce utile si vous avez lancé votre propre compilateur. Vous devrez également définir et exporter LD_LIBRARY_PATH vers le chemin contenant vos bibliothèques stdc ++ incluses si vous suivez cette route. 
2
yggdrasil

Si quelqu'un a le même problème que moi - assurez-vous de ne pas installer à partir du référentiel Ubuntu 14.04 sur une machine 12.04 - la même erreur se produira. La réinstallation à partir du référentiel approprié a résolu le problème.

1
Rob Quist

Cela a fonctionné pour moi:

cp <path_to>/libstdc++.so.6 $PWD
./<executable>

Cette friandise venait de @kerin (commentaire fourni ci-dessus):

vous pouvez consulter http://stackoverflow.com/questions/13636513/linking-libstdc-stically-any-gotchas

À partir de ce lien:

Si vous placez la nouvelle version libstdc ++. So dans le même répertoire que l'exécutable, le problème sera résolu au moment de l'exécution.

L'erreur que je devenais mentionnée que libstdc ++. So.6 venait de/usr/lib64 /, mais ce n'est pas la bibliothèque à laquelle j'ai lié! Le message ressemblait à:

<executing_binary>: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by <executing_binary>)

J'ai vérifié que LD_LIBRARY_PATH avait le répertoire (et que c'était le premier chemin). Pour une raison quelconque, au moment de l'exécution, il regardait toujours /usr/lib64/libstdc++.so.6.

J'ai suivi les conseils de l'article ci-dessus et j'ai copié libstdc ++. So.6 d'où je me suis connecté dans le répertoire avec mon exécutable, puis à partir de là, et cela a fonctionné!

0
nikc

Peut-être que la réponse à cette question est utile ici aussi: comment trouver libstdc ++. So.6: qui contient GLIBCXX_3.4.19 pour RHEL 6?

curl -O http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6-4.7-dbg_4.7.2-5_i386.deb
ar -x libstdc++6-4.7-dbg_4.7.2-5_i386.deb && tar xvf data.tar.gz
mkdir backup
cp /usr/lib/libstdc++.so* backup/
cp ./usr/lib/i386-linux-gnu/debug/libstdc++.so.6.0.17 /usr/lib
ln -s libstdc++.so.6.0.17 libstdc++.so.6
0
Serge Rogatch