/usr/../libstdc++.so.6: версия `GLIBCXX_3.4.11' не найдена (требуется )

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

Итак, у меня есть программа, написанная кем-то другим, и я пытаюсь скомпилировать ее в Matlab, чтобы она заработала. Мой компьютер — рабочая станция Red-hat Enterprise Linux (64 бита) с установленными gcc 4.4.3 и Matlab 2011b. GCC совместим с моим Matlab (http://www.mathworks.com/support/compilers/R2011b/glnxa64.html).

Компиляция работает нормально (я имею в виду, что в командном окне Matlab не появляется сообщение об ошибке). Но после компиляции каждый раз, когда я использую определенную функцию из компиляции (она называется «mexLasso»), она будет показывать такие ошибки:

***Неверный MEX-файл '/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64': /usr/local/matlab_R2011b/bin/glnxa64/../../sys/os/glnxa64 /libstdc++.so.6: версия GLIBCXX_3.4.11 не найдена (требуется /usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64)

Ошибка в тесте (строка 24) alpha=mexLasso(X,D,param);*

Итак, я набрал в терминале «strings /usr/lib/libstdc++.so.6 | grep GLIBC» и обнаружил, что на самом деле в нем находится «GLIBCXX_3.4.11».

Я использую Linux и gcc всего несколько месяцев... так что я еще многого не понимаю. Будет очень полезно, если вы объясните это подробно. Спасибо!!

%% Подробнее: я получил эти программы по машинному обучению с http://spams-devel.gforge.inria.fr/downloads.html. Странно то, что после компиляции другие функции в этом пакете работают нормально (например, "mexTrainDL").


person CSLearner    schedule 21.03.2014    source источник
comment
ubuntuforums.org/showthread.php?t=1809300 Та же проблема. Это твое ?   -  person DumbCoder    schedule 21.03.2014
comment
stackoverflow.com/ вопросы/6284679/   -  person DumbCoder    schedule 21.03.2014
comment
Я проверил тот, который был предоставлен на ubuntuforums, и последовал его решению, но это не помогло :-( [... удалил как символическую ссылку libstdc++.so.6, так и ее связанного партнера libstdc++.so.6* в /$MATLAB/sys /os/glnxa64 и заменил их оба на аналоги с похожими именами из /usr/lib (например, ln -s /usr/lib/libstdc++.so.6*)...]   -  person CSLearner    schedule 21.03.2014
comment
Использование strings и grep немного упрощенно для просмотра того, что определяет библиотека, особенно с учетом искажения имен C++. Используйте nm и связанные инструменты, как описано здесь: stackoverflow.com/questions/34732/   -  person Andrew Janke    schedule 21.03.2014
comment
Сэр, я использую readelf -Ws libstdc++.so.6 и нашел GLIBCXX_3.4.11, за которым следует огромный список таких вещей, как 2497: 00000000 0 OBJECT GLOBAL DEFAULT ABS GLIBCXX_3.4.13. Это нормально?   -  person CSLearner    schedule 21.03.2014


Ответы (4)


Решение, предложенное @whjiang, работает, но имеет два ограничения:

  1. Вам может потребоваться привилегия sudo, чтобы изменить ссылку на библиотечный символ.
  2. Изменение является глобальным и может затронуть всех пользователей.

Так что есть еще один.

Как объясняется в этом ответе MATLAB Central, проблема вызвана Matlab:

Matlab внутренне изменяет LD_LIBRARY_PATH, чтобы предпочесть <MatlabPATH >/sys/os/<ARCH>

и <MatlabPATH>/sys/os/libstdc++.so.6 устарел.

Решение устанавливается LD_PRELOAD при вызове Matlab следующим образом:

env LD_PRELOAD=/usr/lib/libstdc++.so.6  <MatlabPATH>/bin/matlab -desktop

Путь libstdc++.so.6 может отличаться от ОС к ОС. Например, на моем LMDE2 путь /usr/lib/x86_64-linux-gnu/libstdc++.so.6.

person Yantao Xie    schedule 18.12.2015
comment
Спасибо!! это действительно сделало мой день (или скорее ночь) :) - person Nikole; 14.10.2016
comment
Есть ли способ сделать это исправление постоянным? Вместо того, чтобы запускать каждый раз это: env LD_PRELOAD=/usr/lib/libstdc++.so.6 ‹MatlabPATH›/bin/matlab ??? - person seralouk; 29.01.2019
comment
@seralouk Я думаю, что это возможно, если вы напишете скрипт для учета таких проблем, как версия Matlab, тип и версия ОС и т. д. Так что я не думаю, что это стоит делать. - person Yantao Xie; 30.01.2019

Ответ на этот вопрос содержится в FAQ по libstdc++: http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths

person Jonathan Wakely    schedule 06.05.2014
comment
Привет, спасибо за мысль! На самом деле я обнаружил, что на моем компьютере есть две учетные записи Linux, и мне нужно скомпилировать их с использованием учетной записи root, чтобы использовать ее в учетной записи пользователя. Вероятно, это связано с тем, что общая библиотека может использоваться только учетной записью root. - person CSLearner; 08.05.2014
comment
Это маловероятно, похоже, вы что-то не так поняли. Возможно, вам придется выполнить последний шаг make install от имени root, но ничего не компилировать от имени root. - person Jonathan Wakely; 08.05.2014

Вот решение:

sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 /usr/local/MATLAB/R2011b/bin/glnxa64/libstdc++.so.6

объяснение и ссылка: http://fantasticzr.wordpress.com/2013/05/29/matlab-error-libstdc-so-version-glibcxx_3-4-15-not-found/

person whjiang    schedule 08.10.2014

Простое решение с этой страницы ( http://ubuntuforums.org/showthread.php?t=808045 ), который сработал для меня. Перейдите в каталог Matlab, где хранятся libstdc++.so.6 и libgcc_s.so.1. В моем случае это было:

cd /usr/local/MATLAB/MATLAB_Production_Server/R2015a/sys/os/glnxa64

Затем переименуйте libstdc++.so.6 и libgcc_s.so.1:

sudo mv libstdc++.so.6 libstdc++.so.6.orig
sudo mv libgcc_s.so.1 libgcc_s.so.1.orig

Вот и все!

person Urdojo    schedule 23.12.2015