Ответ 1
Ссылка статически на libstdС++ с опцией -static-libstdc++
gcc.
Так что теперь я отчаянно пытаюсь найти решение этой проблемы. Я собираю разделяемую библиотеку .so в Ubuntu 32 бит (пробовал делать это под Debian и Ubuntu 64 бит, но ни одна не работала)
Я продолжаю получать: /usr/lib/libstdc++.so.6: version ''GLIBCXX_3.4.15' not found
каждый раз, когда я пытаюсь загрузить свой плагин.
Вот как я получаю эту ошибку:
Вот несколько ссылок, которые я нашел и попробовал, но ни одна из них не работала для меня:
(Мой старый вопрос: я как-то исправил это через несколько дней после публикации этого вопроса, но я не могу вспомнить, как именно я это сделал)
Другой пользователь с той же проблемой
Я вижу, что некоторые люди исправили это, переместив libstdc++ (я думаю) в какой-то каталог, а затем указав или связав idk с этим каталогом, но это меня просто озадачило.
Кто-нибудь знает исправление?
(Изменить :) - Выполнение: strings/usr/lib/libstdc++.so.6 | grep GLIBC
strings/usr/lib/libstdc++.so.6 | grep GLIBC
в терминале дает мне: strings '/usr/lib/libstdc++.so.6': No such file
. Может ли это быть проблема? И если да, то как мне установить эту библиотеку?
(Edit2 :) Кто-нибудь еще знает о решении?
(Edit3) Все еще нуждается в решении. Есть ли способ узнать, на каком дистрибутиве была скомпилирована общая библиотека? Я знаю, что однажды скомпилировал эту же библиотеку, но не помню !!
(Edit4) ldd my_lib_.so
дает мне:
linux-gate.so.1 => (0xb77d7000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76c1000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74ce000)
/lib/ld-linux.so.2 (0xb77d8000)
ldd program_im_loading_so_into
дает мне:
linux-gate.so.1 => (0xb77d8000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb77c0000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb77a5000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76bb000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb768f000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7672000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74c9000)
/lib/ld-linux.so.2 (0xb77d9000)
бегущие strings/usr/lib/i386-linux-gnu/libstdc++.so.6 | grep GLIBCXX
strings/usr/lib/i386-linux-gnu/libstdc++.so.6 | grep GLIBCXX
дает мне:
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
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
и наконец вот моя версия gcc:
'gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)'
Ссылка статически на libstdС++ с опцией -static-libstdc++
gcc.
Я исправил эту проблему, установив: sudo apt-get install libstdc++6
В моем случае я столкнулся с этой проблемой после установки MongoDB 3.0.1
mongo:/usr/lib/x86_64-linux-gnu/libstdc++.so.6: версия `GLIBCXX_3.4.18 'не найдена (требуется mongo)
Просто установите последнюю версию из репозитория nondefault:
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install libstdc++6-4.7-dev
эту проблему можно решить, установив последнюю версию libstdС++.
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install libstdc++6-7-dbg
Вверху вы указываете, что компилируете свою часть своих шагов для воспроизведения, но затем ниже вы произносили произносимое править,
"есть ли способ увидеть, на какой дистрибутив была скомпилирована общая библиотека?"
Скомпилировано ли это в одном дистрибутиве, и даже другая версия того же дистрибутива - важная деталь, особенно для приложений на С++.
Связывание с библиотеками С++, в том числе libstdС++, может иметь смешанные результаты, насколько я могу судить. Вот связанный вопрос о перекомпиляции с разными версиями С++.
нужно ли перекомпилировать библиотеки с помощью С++ 11?
В принципе, если вы скомпилировали против С++ на другой дистрибутив (и, возможно, другую версию gcc), это может вызвать проблемы.
Я думаю, у вас есть два варианта:
Если у кого-то такая же проблема, как у меня, убедитесь, что вы не устанавливаете из репозитория Ubuntu 14.04 на машину 12.04 - она дает такую же ошибку. Переустановка из соответствующего хранилища исправила проблему.
Это сработало для меня:
cp <path_to>/libstdc++.so.6 $PWD
./<executable>
Этот кусок от @kerin (комментарий предоставлен выше):
вы можете проверить fooobar.com/questions/95984/...
По этой ссылке:
Если вы поместите более новый libstdc++.so в тот же каталог, что и исполняемый файл, он будет найден во время выполнения, проблема решена.
Я получал сообщение об ошибке, что libstdc++.so.6 исходил из /usr/lib64/, но это не та библиотека, с которой я связан! Сообщение выглядело так:
<executing_binary>: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (required by <executing_binary>)
Я проверил, что LD_LIBRARY_PATH имеет каталог (и что это был первый путь). По какой-то причине во время выполнения он все еще просматривал /usr/lib64/libstdc++.so.6.
Я воспользовался советом из вышеприведенной статьи и скопировал libstdc++.so.6, откуда сошёл в каталог со своим исполняемым файлом, побежал оттуда, и это сработало!
Возможно, здесь также пригодится ответ на этот вопрос: как найти libstdc++.so.6: содержащий GLIBCXX_3.4.19 для RHEL 6?
curl -O http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6-4.7-dbg_4.7.2-5_i386.deb
ar -x libstdc++6-4.7-dbg_4.7.2-5_i386.deb && tar xvf data.tar.gz
mkdir backup
cp /usr/lib/libstdc++.so* backup/
cp ./usr/lib/i386-linux-gnu/debug/libstdc++.so.6.0.17 /usr/lib
ln -s libstdc++.so.6.0.17 libstdc++.so.6