GLIBCXX_3.4.9 не найден

У меня проблема с libstdc++.so.

Я установил новую версию gcc и попытался скомпилировать код C++. Компиляция работала, но когда я пытаюсь запустить бинарник (m5.opt — это его имя), я получаю следующую ошибку:

build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).

Нужно ли заменить libstdc++.so? И если да, то где я могу скачать нужную мне версию? На сайте GCC говорится, что libstdc++ теперь является частью gcc.

Подробности

GCC: Раньше у меня был gcc 4.1.2, но я скачал gcc 4.2.4. Из незаархивированного gcc-каталога я выполнил ./configure; сделать; sudo сделать установить`. Когда я пытался использовать gcc или g++ для компиляции, версия по умолчанию все еще была 4.1.2. Чтобы преодолеть это, я заменил некоторые ссылки:

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

Linux-версия: uname -a дает:

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


person Maximilien    schedule 23.12.2009    source источник
comment
Какой дистрибутив Linux вы используете?   -  person Tzvetan Mikov    schedule 23.12.2009


Ответы (3)


Проблема в том, что вы создали свой новый GCC неправильно: в Linux вы должны использовать

./configure --prefix=/usr

Префикс установки по умолчанию — /usr/local, поэтому make install помещает двоичные файлы gcc и g++ в /usr/local/bin и т. д.

Что происходит с вами сейчас, так это то, что вы компилируете и компонуете, используя новый (символический) GCC 4.2.4, но во время выполнения ваша программа привязывается к старому /usr/lib64/libstdc++.so.6 (версия 6.0.8 вместо требуемой 6.0.9). Вы можете подтвердить это, запустив ldd build/ALPHA_SE/m5.opt: вы должны увидеть, что он использует /usr/lib64/libstdc++.so.6.

Есть несколько исправлений, которые вы могли бы сделать.

env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt

должен показать вам, что настройки LD_LIBRARY_PATH достаточно, чтобы перенаправить двоичный файл в правильную библиотеку, и

LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt

должен просто бежать. Вы можете «запечь» этот путь в двоичный файл m5.opt, повторно связав его с -Wl,-rpath=/usr/local/lib64.

Более постоянное решение — исправить библиотеки так же, как вы исправляли двоичные файлы:

cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .

Еще лучшее решение — перенастроить новый GCC на --prefix=/usr, а затем на make all install.

person Employed Russian    schedule 26.12.2009
comment
Спасибо! У меня все еще были некоторые проблемы с make all install, поэтому я удалил незаархивированный каталог gcc и начал с нуля. Я запустил ./configure --prefix=/usr, make и sudo make install. Теперь это работает! Спасеба! - person Maximilien; 05.01.2010

Я знаю, что это очень старый вопрос, но...

Обычно не рекомендуется заменять системный компилятор (то есть тот, что находится в /usr), потому что вся система будет построена с его помощью и будет зависеть от него.

Обычно лучше установить новый компилятор в отдельное место, а затем просмотреть часто задаваемые вопросы по libstdc++ Как мне застраховаться что будет найдена динамически подключаемая библиотека? и Поиск динамических или общих библиотек в руководстве о том, как убедиться, что правильный libstdc++.so найден во время выполнения.

person Jonathan Wakely    schedule 22.06.2012

Другие ответы здесь должны быть в порядке, но «быстрое и простое» решение, если у вас действительно установлен gcc в /usr/local/, заключается в том, чтобы просто добавить новые библиотеки в LD_LIBRARY_PATH

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

Вы также можете проверить, установлены ли у вас правильные версии GLIBC, используя

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

Я получил этот последний совет с другого форума, так что кредиты должны быть там, где должны кредиты!

person Colin D    schedule 22.04.2014
comment
Вы правы, это не только безопаснее, но и проще и быстрее - person lrleon; 23.04.2015