/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 ++. Так.6, щоб вказати на нове, і тепер все працює.


1
У мене така ж проблема, і ця публікація / відповідь - саме те, що я шукаю. Дуже дякую!
йоко

1
Це працює і з gcc 4.6.2, за винятком того, що це libstdc ++. So.6.0.16. Дякую!
Venesectrix

2
Шахта становить gcc 4,7, а libstdc ++., Так.6.0.17. Була така ж проблема, вирішена за допомогою цього рішення. Кудос.
Рікбіт

1
Так, є. Тут apt-getописано
базове

4
@roosevelt: це не проблема з ОС, це проблема в тому, що користувачі самі встановлюють програмне забезпечення, а потім неправильно використовують лінкер. Це питання: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Джонатан

54

У минулому я уникав цієї проблеми, просто пов'язуючи libstdc ++ статично з цим параметром, надісланим до g ++ під час посилання мого виконуваного файлу:

-static-libstdc++

Якщо статичне посилання в бібліотеку є варіантом, це, мабуть, найшвидший спосіб вирішення проблеми.


2
Велике спасибі, я спробував будь-яке інше запропоноване рішення щодо ТА, і нічого не вийшло, окрім цього.
Ітамар Кац

1
Дякую за ваше рішення, мені це дуже допомагає!
Brightshine

Проблема полягає в тому, що бібліотеку неможливо знайти, не те, що вам слід статично зв’язувати. Дивіться відповідь від @Hobo.
Дан Мергенс

45

Я намагався примусити кланг до роботи (що також вимагає 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, ....: Я отримую:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin

14

З цією проблемою я стикаюся, коли намагаюся використовувати engla matlab для виклику m функцій з коду c що відбувається з командоюmex -f .. ..

Моє рішення:

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

Я виявив, що це включає 3.4.15

тож у моїй системі є новітні губи.

проблема виходить із самого matlab, він називає власний libstdc ++. so.6 from {MATLAB}/bin

тож просто замініть його оновленою системною вкладкою.


Здається, це також працює для мене в Matlab 2013b x64 на Xubuntu 13.04 x64
Marcin

Дуже дякую. Мені просто довелося створити нове символічне посилання для файлу в {MATLAB}/binфайл /usr/lib/, а потім перезапустити матлаб. Це працює в Matlab 2010b на Fedora 14 x64.
Вок

2

У мене така ж помилка. Ось як це працювало для мене:

  • очистили проект під поточно встановленим gcc
  • перекомпілював його

Працювали чудово!


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


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 / bin / 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

проблема вирішена.


1

Я витяг їх із RPM ( RPM для libstdc ++ ), а потім:

export LD_LIBRARY_PATH=.

Щоб встановити систему на пошук бібліотек у поточному каталозі. Тоді якраз виконував мою програму. Але в моєму випадку я отримав єдиний виконуваний файл, який мені знадобився, це не було систематичною зміною.


0

У мене була подібна проблема, і я вирішив її шляхом статичного підключення libstdc++до програми, яку я компілював, наприклад:

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

замість звичного

$ ./configure ... etc.

Можуть виникнути проблеми з цим рішенням, пов’язаним із завантаженням спільних бібліотек під час виконання, але я не вивчив проблему досить глибоко, щоб прокоментувати.



0

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

су

Чомусь після нормальної компіляції я не зміг її виконати (те саме повідомлення про помилку). Безпосередньо ssh для іншого облікового запису користувача працює.


Це насправді не відповідає на питання. Якщо у вас інше питання, ви можете задати його, натиснувши Задати питання . Ви також можете додати щедрості, щоб привернути більше уваги до цього питання.
ravron

Ні, це не відбувається, тому що в мене була точно така ж проблема. Це було викликано зміною користувача. Це також могло статися з кимось іншим, скажімо, зміною на root.
HelloWorld

Моя помилка! Мене кинув перший рядок, який виглядав так, що у вас теж були проблеми. Продовжуй!
ріврон

Я також використовував Ubuntu, а також намагався компілювати програми, а також отримав те саме повідомлення про помилку, як у питанні. Моя помилка полягала в тому, що я робив це в іншому обліковому записі користувача за допомогою команди su. Я думаю, що це відповідає на питання, тому що він вирішує, чому і як щодо проблеми. Це, безумовно, можливість.
HelloWorld

І одному користувачеві було встановлено LD_LIBRARY_PATH, щоб знайти нову лібу, а не іншого користувача? Це виглядає трохи далеко в конкретному контексті цього питання.
Марк Глісс

0

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

Використовуючи -L до шляху, на який я посилався, давали попередження про "пропуск несумісного libstdc ++. Тому під час пошуку -lstdc ++". Це був натяк, який допоміг мені остаточно вирішити проблему.


0

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


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 ++ під час створення. з / що, я можу запустити a.out

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

Примітка: команда вище є тимчасовою; це не загальносистемна зміна.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.