web-dev-qa-db-fra.com

GLIBCXX_3.4.21 non défini dans le fichier libstdc ++. So.6 avec référence de temps de liaison

Toutes mes excuses, je comprends que des questions très similaires à celles-ci ont été posées assez souvent, bien qu'aucune des solutions ne semble fonctionner pour moi. Le message d'erreur complet est:

/main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

en exécutant un autre projet, j'obtiens une erreur très similaire:

./main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

Je n'ai en fait aucun problème avec la compilation, car ces projets se compilent tous les deux très bien. Cela se produit simplement lorsque j'essaie d'exécuter l'exécutable. Je pensais que c'était une erreur avec mon installation de gcc, donc aujourd'hui je l'ai réinstallé, même si cela n'a pas aidé du tout. Je ne sais pas vraiment quoi faire pour résoudre ce problème, quelqu'un peut-il offrir de l'aide?

Ceci est le Makefile que j'utilise pour compiler l'un des projets, je pense que c'est là que l'erreur pourrait être:

CC= g++
CFLAGS= -Wall -g -std=c++11 -lX11 -lpthread
OBJS = main.o Board_Tile.o Sliding_Solver.o

main: $(OBJS)
   $(CC) -o $@ $(OBJS)
%.o : %.cc
   $(CC) $(CFLAGS) -c $^

Ma version gcc est 5.3.0, j'utilise Ubuntu 14.0.4.

9
asharkdoctor

GCC 5.1 ou 5.2 (je ne me souviens plus maintenant, google) a changé C++ ABI. Votre ubuntu standard (y compris libstdc ++) est compilé avec l'ancien ABI.

Votre compilateur gcc essaie d'utiliser le nouvel ABI. Parfois, cela fonctionne, la plupart du temps - non.

Il existe donc 3 façons de compiler votre code:

1) rétrograder gcc

2) ajouter l'indicateur -D_GLIBCXX_USE_CXX11_ABI = 0 (exemple cmake) (si vous procédez de cette façon, vous devez ajouter cet indicateur à chaque makefile ou projet que vous construisez jusqu'à ce que vous mettiez à jour ubuntu ou rétrogradiez gcc)

3) mise à niveau d'Ubuntu (testé, par la façon dont 16.04 va avec le nouvel ABI et le nouveau gcc par défaut, j'ai dû ack-grep et supprimer le drapeau mentionné ci-dessus de tous mes projets pour animaux de compagnie)

aussi: Comprendre le _GLIBCXX_USE_CXX11_ABI de GCC 5 ou le nouvel ABI

P.S. chose drôle, la réponse est dans la question: _ZNSt7__cxx11: CXX11 , bien que nous ne lisions pas vraiment les messages d'erreur.

18
strangeqargo

before_install:

Cette solution de contournement est requise pour éviter les erreurs libstdc ++ lors de l'exécution de hugo "étendu" avec prise en charge SASS.

  • wget -q -O libstdc++6 http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_AMD64.deb
  • Sudo dpkg --force-all -i libstdc ++ 6

    installer:

  • wget -q -O hugo.deb https://github.com/gohugoio/hugo/releases/download/v0.46/hugo_extended_0.46_Linux_64bit.deb

  • Sudo dpkg -i hugo.deb

J'ai trouvé cette réponse ici , et cela a fonctionné pour moi