GLIBCXX_3.4.9 не найден - PullRequest
       31

GLIBCXX_3.4.9 не найден

22 голосов
/ 23 декабря 2009

У меня проблема с 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

Ответы [ 3 ]

26 голосов
/ 27 декабря 2009

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

8 голосов
/ 23 июня 2012

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

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

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

5 голосов
/ 22 апреля 2014

Остальные ответы здесь должны быть хорошими, но «быстрое и простое» решение, если у вас установлен 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

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

...