GLIBCXX 3.4.9 не найден


У меня есть проблема, касающаяся libstdc++. so.

Я установил новую версию gcc и попытался скомпилировать код c++. Компиляция работала, но когда я пытаюсь выполнить двоичный файл (m5.opt - это его название) у меня есть следующая ошибка: сборка/ALPHA_SE/М5.опт: в /usr/lib64/libstdc++в.так.6: версия `GLIBCXX_3.4.9' не найден (требуется создать/ALPHA_SE/М5.выбирать).

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

Я надеюсь, что кто-нибудь сможет мне помочь! Я только 4 месяца на Linux сейчас, так что все очень ново для меня.

Макс

Подробности

GCC:
У меня был gcc 4.1.2 раньше, но я скачал gcc 4.2.4. Из неиспорченного gcc-каталога я выполнил"./настроить"; "принять"; "установка". Когда я попытался использовать 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++в.так.6 -> с libstdc++.так.6.0.8
/usr/местные/библиотека/с libstdc++.так -> с libstdc++.так.6.0.9
/Либ/библиотеки libc.так.6 -> файл libc-2.5.так -> файл libc-2.5.так

Linux-версия:
uname-a дает: Linux madmax 2.6.18-128.4.1.el5 #1 SMP Вт Aug 4 12: 51: 10 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

3 22

3 ответа:

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

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

То, что происходит с вами сейчас, заключается в том, что вы компилируете и связываете с помощью нового (symlinked) 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.выберите двоичный файл, повторно связав его с -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.

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

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

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

Другие ответы здесь должны быть прекрасны, но "быстрое и простое" решение, если у вас есть 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

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