/usr/lib/libstdc++.so.6: версия `GLIBCXX_3.4.15 'не найдена

135

Как я могу получить GLIBCXX_3.4.15 в Ubuntu? Я не могу запустить некоторые программы, которые я компилирую.

Когда я делаю:

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

Я получил:

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
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

Спасибо за любую помощь!

Крис
источник

Ответы:

81

Я собираю GCC 4.6 из источника, и, видимо,

sudo make install 

не поймал этого. Я покопался и нашел

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

Я скопировал его в / usr / lib и перенаправил libstdc ++. So.6, чтобы указать на новый, и теперь все работает.

Крис
источник
1
У меня та же проблема, и этот пост / ответ именно то, что я ищу. Большое спасибо!
Йоко
1
Это работает и с gcc 4.6.2, за исключением того, что это libstdc ++. So.6.0.16. Спасибо!
Venesectrix
2
Мой gcc 4.7 и libstdc ++. So.6.0.17. Была такая же проблема, исправлена ​​с помощью этого решения. Престижность.
Рикбит
1
Да, есть. apt-getНа основе решения этой проблемы описано здесь: superuser.com/questions/310809/...
aroth
4
@roosevelt: проблема не в ОС, а в том, что пользователи сами устанавливают программное обеспечение, а затем неправильно используют компоновщик. Это часто задаваемые вопросы: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Джонатан Уэйкли
54

В прошлом я избегал этой проблемы, просто статически связывая libstdc ++ с этим параметром, отправляемым в g ++ при связывании моего исполняемого файла:

-static-libstdc++

Если статическое связывание в библиотеке является опцией, это, вероятно, самый быстрый обходной путь.

Мартин Г
источник
2
Большое спасибо, я попробовал любое другое решение, предложенное на SO, и ничего не работало, кроме этого.
Итамар Кац
1
Спасибо за ваше решение, оно мне очень помогает!
Brightshine
Проблема в том, что библиотека не может быть найдена, а не в том, что вы должны статически связываться. Смотрите ответ от @Hobo.
Дэн Мергенс
45

Я пытался заставить работать clang (который также требует 6.0.15), и пока я копался, я обнаружил, что он установлен на /usr/local/lib/libstdc++.so.6.0.15. Он установлен там, когда я установил графит (экспериментальная версия GCC).

Если вам нужен доступ к библиотекам в этом месте, то вам нужно определить LD_LIBRARY_PATHкак:

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

Я смог заставить лягушку работать после этого. Надеюсь, что это полезно для кого-то.

Бродяга
источник
Я работал над встроенной целью, и у меня возникла та же проблема, ваше решение, похоже, не работает в моем случае. На самом деле большая часть двоичного файла в целевой программе использует библиотеку c по умолчанию в / lib, поэтому изменение LD_LIBRARY_PATHповлияет на них. все они будут ссылку на новую библиотеку, в конце концов большинство из бинарников не работают: такие как ls grep, ....: I'am получение:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Муин
14

Я сталкиваюсь с этой проблемой при попытке использовать matlab eng для вызова m функций из c кода. что происходит с командойmex -f .. ..

Мое решение:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

Я нашел, что включает в себя 3.4.15

так что моя система имеет новейшие библиотеки.

проблема возникает из самого matlab, он вызывает свой собственный libstdc ++. so.6 из {MATLAB}/bin

так что, просто замените его на обновленную систему lib.

Ченг Чанг
источник
Это, кажется, также работает для меня в Matlab 2013b x64 на Xubuntu 13.04 x64
Марчин
Большое спасибо. Мне просто нужно было создать новую символическую ссылку для файла в {MATLAB}/binфайл /usr/lib/, а затем перезапустить Matlab. Это работает в Matlab 2010b на Fedora 14 x64.
Wok
2

Я получил ту же ошибку. Вот как это работает для меня:

  • убрал проект под установленный в данный момент gcc
  • перекомпилировал это

Работал отлично!

iueae
источник
2

Для этой ошибки я скопировал последнюю версию libstdc ++. So.6.0.17 с другого сервера, удалил программную ссылку и воссоздал ее.

1. Скопируйте libstdc ++. So.6.0.15 или более позднюю версию с другого сервера в уязвимую систему.
В моем случае SUSE linux 11 SP3 был последним.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (в каталоге / usr / lib64).

NJoy

crazyLinux
источник
2

Я только что столкнулся с подобной проблемой сборки версии LLVM 3.7. Сначала проверьте, установлена ​​ли в вашей системе необходимая библиотека:

$locate libstdc++.so.6.*

Затем добавьте найденное местоположение в переменную окружения $ LD_LIBRARY_PATH.

Арсен
источник
2
Это работает, только если у вас есть libstdc ++. So.6. * Lib с поддержкой
GLIBCXX_3.4.15
2

Иногда вы не контролируете целевой компьютер (например, ваша библиотека должна работать в заблокированной корпоративной системе). В таком случае вам нужно будет перекомпилировать ваш код, используя версию GCC, соответствующую их версии GLIBCXX. В этом случае вы можете сделать следующее:

  1. Посмотрите последнюю версию GLIBCXX, поддерживаемую целевой машиной: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Скажите, что версия 3.4.19.
  2. Используйте https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html, чтобы найти соответствующую версию GCC. В нашем случае это так [4.8.3, 4.9.0).
Гили
источник
1

gcc версии 4.8.1, ошибка выглядит так:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: версия `GLIBCXX_3.4.15 'не найдена (требуется для / root / bllvm / build / Release + Asserts / бен / LLVM-tblgen)

Я нашел libstdc ++. So.6.0.18 в том месте, где я выполнил gcc 4.8.1

Тогда я так делаю

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

задача решена.

Favoorr
источник
1

Я извлек их из RPM ( RPM для libstdc ++ ) и затем:

export LD_LIBRARY_PATH=.

Установить систему для поиска библиотек в текущем каталоге. Затем просто выполнил мою программу. Но в моем случае я получил один исполняемый файл, который мне был нужен, это не было общесистемным изменением.

prmottajr
источник
0

У меня была похожая проблема, и я решил ее статически, связывая libstdc++с программой, которую я компилировал, вот так:

$ LIBS=-lstdc++ ./configure ... etc.

вместо обычного

$ ./configure ... etc.

Могут быть проблемы с этим решением, связанные с загрузкой разделяемых библиотек во время выполнения, но я недостаточно глубоко изучил проблему, чтобы прокомментировать.

Евгений Сергеев
источник
0

У меня была такая же проблема, потому что я сменил пользователя с себя на другого:

су

По какой-то причине после обычной компиляции я не смог ее выполнить (то же сообщение об ошибке). Непосредственно ssh для другой учетной записи пользователя работает.

Привет мир
источник
Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу.
Раврон
Нет, потому что у меня была точно такая же проблема. Это было вызвано изменением пользователя. Это также могло произойти с кем-то еще, скажем, с правами root.
HelloWorld,
Моя ошибка! Меня бросила первая строчка, которая выглядела так, словно у тебя тоже была проблема. Продолжать!
Раврон
Я также использовал Ubuntu и также пытался скомпилировать программы, а также получил то же сообщение об ошибке, что и в вопросе. Моя ошибка заключалась в том, что я делал это в другой учетной записи пользователя с помощью команды su. Я думаю, что это отвечает на вопрос, потому что это касается почему и как о проблеме. Это, безусловно, возможность.
HelloWorld,
И у одного пользователя был установлен LD_LIBRARY_PATH для поиска новой библиотеки, но не у другого пользователя? Это кажется немного надуманным в конкретном контексте этого вопроса.
Марк Глисс
0

У меня было установлено несколько версий компилятора gcc, и мне нужно было использовать более свежую версию, чем установка по умолчанию. Поскольку я не являюсь системным администратором для наших систем Linux, я не могу просто изменить / usr / lib или многие другие предложения, приведенные выше. Я столкнулся с этой проблемой и в конце концов отследил ее, установив путь к каталогу 32-битной библиотеки вместо каталога 64-битной библиотеки (lib64). Поскольку библиотеки в 32-разрядном каталоге были несовместимы, система по умолчанию установила более старую версию, которая устарела.

Использование -L к пути, на который я ссылался, давало предупреждения о "пропуске несовместимого libstdc ++. Поэтому при поиске -lstdc ++". Это был намек, который помог мне окончательно решить проблему.

Cathy
источник
0

То же самое с версией gcc 4.8.1 (GCC)и libstdc++.so.6.0.18. Пришлось скопировать его здесь, /usr/lib/x86_64-linux-gnuна мою коробку Ubuntu.

ervinbosenbacher
источник
0

В моем случае LD_LIBRARY_PATH был / usr / lib64 первым перед / usr / local / lib64. (Я строил llvm 3.9).
У нового компилятора gcc, который я установил для компиляции llvm 3.9, были библиотеки, использующие более новые библиотеки GLIBCXX в / usr / local / lib64, поэтому я исправил LD_LIBRARY_PATH, чтобы компоновщик сначала увидел / usr / local / lib64.
Это решило эту проблему.

Чан Ким
источник
0

Я просто использовал -static-libstdc ++ при сборке. с этим я могу запустить

g++ test.cpp -static-libstdc++
Суреш
источник
0

Для целей тестирования:

На исходном компьютере найдите библиотеку, скопируйте в тот же каталог, что и исполняемый файл:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

Затем скопируйте эту же библиотеку на целевой компьютер и запустите исполняемый файл:

LD_LIBRARY_PATH=. ./myexecutable

Примечание: указанная выше команда является временной; это не общесистемное изменение.

Контанго
источник