Подтвердить что ты не робот

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 make install '. Когда я пытался использовать 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

4b9b3361

Ответ 1

Проблема в том, что вы неправильно создали свой новый 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.

Ответ 2

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

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

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

Ответ 3

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

Я получил этот последний совет с другого форума, поэтому кредиты, причитающиеся за кредиты!