GLIBCXX_3.4.21 не определен в файле libstdc++.so.6 со ссылкой на время ссылки

Извините, я понимаю, что вопросы, очень похожие на этот, задавались относительно часто, хотя ни одно из решений, похоже, не работает для меня. При попытке запустить любой код С++ разумной сложности я получаю указанную выше ошибку. Полное сообщение об ошибке:

/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

запуская другой проект, я получаю очень похожую ошибку:

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

На самом деле у меня нет проблем с компиляцией, так как эти проекты компилируются нормально. Это просто происходит, когда я пытаюсь запустить исполняемый файл. Я думал, что это была ошибка с моей установкой gcc, поэтому сегодня я переустановил его, хотя это совсем не помогло. Я действительно не знаю, что делать, чтобы исправить это, может ли кто-нибудь предложить помощь?

Это Makefile, который я использую для компиляции одного из проектов, я чувствую, что здесь может быть ошибка:

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 $^

Моя версия gcc — 5.3.0, у меня Ubuntu 14.0.4.


person asharkdoctor    schedule 23.04.2016    source источник
comment
Что произойдет, если вы попытаетесь запустить свою программу, набрав LD_LIBRARY_PATH=/usr/local/lib ./main вместо ./main?   -  person zwol    schedule 24.04.2016


Ответы (4)


GCC 5.1 или 5.2 (сейчас не помню, погуглите) изменил C++ ABI. Ваша стандартная Ubuntu (включая libstdc++) скомпилирована со старым ABI.

Ваш компилятор gcc пытается использовать новый ABI. Иногда получается, чаще - нет.

Итак, есть 3 способа компиляции кода:

1) понизить версию gcc

2) добавьте флаг -D_GLIBCXX_USE_CXX11_ABI=0 (пример cmake) (если вы пойдете по этому пути, вы должны добавить этот флаг в каждый make-файл или проект, который вы создаете, до тех пор, пока вы не обновите Ubuntu или понизите версию gcc)

3) обновить Ubuntu (протестировал, кстати, 16.04 идет с новым ABI и новым gcc по умолчанию, мне пришлось ack-grep и удалить упомянутый выше флаг из всех моих любимых проектов)

также: Понимание _GLIBCXX_USE_CXX11_ABI GCC 5 или нового ABI

P.S. забавно, ответ есть в вопросе: _ZNSt7__cxx11 : CXX11, хотя сообщения об ошибках мы особо не читаем.

person strangeqargo    schedule 23.04.2016
comment
Идеальный! Этот флаг makefile работал как шарм. Понижение версии gcc похоже на то, что я должен сделать - будет ли работать любая версия в диапазоне 4.XX? - person asharkdoctor; 24.04.2016
comment
Это зависит от: если вы работаете со стандартом С++ 11/14, некоторые вещи могут пойти не так, потому что они несовместимы со старыми версиями gcc (gcc.gnu.org/projects/cxx-status.html#cxx11), предлагаю обновить. - person strangeqargo; 24.04.2016

до_установки:

Этот обходной путь необходим, чтобы избежать ошибок libstdc++ при запуске «расширенного» Hugo с поддержкой 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

    установить:

  • 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

Я нашел этот ответ здесь, и это сработало для меня

person Jackson Junior Mkhabela    schedule 01.04.2019

обновить ссылку для скачивания libstdc++6 до:

http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.12_amd64.deb

person user2670800    schedule 29.12.2019
comment
Почему вы загружаете это вручную, а не устанавливаете с помощью apt? Как вы проверяете, что это правильный файл и что он не был испорчен при передаче? - person Robert; 29.12.2019

Итак, у меня была такая же ошибка в Ubuntu 18.04, и вот шаги для ее исправления:

  1. Запустите это, чтобы проверить, чего не хватает
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

Вы получите что-то вроде

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_3.4.20
GLIBCXX_3.4.21
GLIBCXX_DEBUG_MESSAGE_LENGTH

Затем запустите:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test

sudo apt-получить обновление

sudo apt-get установить gcc-5

sudo apt-получить обновление libstdc++6

Хотя бы запустите еще раз, чтобы подтвердить изменения

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

person dannybastos    schedule 17.03.2020