Как сказать mex для связи с libstdС++. So.6 в /usr/lib вместо того, который находится в каталоге MATLAB?
Теперь mex в MATLAB 2012a официально поддерживает gcc 4.4.6, но я хочу использовать gcc 4.7 на свой страх и риск. Теперь, если я скомпилирую что-то с mex напрямую, он будет жаловаться, что
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl_c.so.4)
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl.so.9)
От strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX'
Я подтверждаю, что этот libstdc++.so.6
имеет эту строку версии. Я просмотрел mexopts.sh
и изменил переменную $RPATH
и $MLIBS
в script, но она не работает. Поэтому, если я не использую символическую ссылку, где я могу настроить путь к libstdc++.so.6
, который использует mex? Спасибо.
Ответы
Ответ 1
Вам нужно создать символическую ссылку на библиотеку gcc 4.7, чтобы Matlab знал ее использовать. Что-то вроде:
ln -s {/path/to/file-name} {link-name}
Если вы не хотите использовать символические ссылки, просто определите этот путь в терминале, с которого вы запускаете matlab:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libstdc++.so.6
./matlab
Ответ 2
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6: версия `GLIBCXX_3.4.15 'не найдена
Проблема заключается в том, что когда вы строите с помощью mex
, он помещает -L/usr/local/MATLAB/R2012a/sys/os/glnx86
в линию ссылок, и поэтому компоновщик поднимает libstdc++.so
оттуда.
Если вы не можете убедить mex
сначала добавить -L/usr/lib/i386-linux-gnu
, тогда я думаю, что ваш единственный выбор - удалить /usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so
(просто переименуйте его, например, libstdc++.so.bak
).
Ответ 3
Это поздний ответ, но я считаю, что самое чистое, самое одобренное Mathworks и наименее инвазивное решение - отредактировать .matlab7rc.sh
script. Это script, используемый matlab
script при запуске MATLAB под UNIX-подобными системами. (См. http://www.mathworks.ch/ch/help/matlab/ref/matlabunix.html)
Скопируйте script (найденный под {matlabroot}/bin
) в корень вашего проекта или в свой домашний каталог. Затем скажите MATLAB для первого поиска в системных каталогах для библиотек С++, а не для собственных каталогов. В моей системе я изменил строку 191:
191c191
< LDPATH_PREFIX='/usr/lib/x86_64-linux-gnu'
---
> LDPATH_PREFIX=''
(Просто установка LD_LIBRARY_PATH
в пустую строку не является хорошим решением, поскольку это не позволит вам загружать другие сторонние библиотеки.)
Когда это будет сделано, вы можете получить следующее сообщение при запуске mex
:
/usr/bin/ld: cannot find -lstdc++
Это обычно означает, что g++
не установлен. В Debian-подобной системе запустите:
sudo apt-get install g++
Здесь вы можете получить раздражающее предупреждение об использовании версии gcc за пределами официально поддерживаемой, но это безвредно и может быть проигнорировано.
Ответ 4
Я попробовал оба ответа.. но никто не работал у меня.
однако это сработало для меня. в matlab запустите это -
setenv('LD_LIBRARY_PATH', '');
только для тех, кто сталкивается с одной и той же проблемой.
P.S: Я нашел это решение здесь
Ответ 5
Вы можете изменить ~/.matlab/R2012a/mexopts.sh
, сгенерированный после выполнения mex -setup
, добавив строку в раздел glnx86:
LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH'
или в glnx64:
LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH'
Ответ 6
Мне не удалось найти, где находится libstdС++. so.6, поэтому я не смог полностью проверить решение, данное geek_girl. Однако была изменена модификация th1rdey3. Я побежал в консоли matlab:
setenv('LD_LIBRARY_PATH', 'usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64:/usr/local/MATLAB/R2011a/bin/glnxa64:/usr/lib/boost_1_54_0/libs/regex/build/gcc');
Это значение, которое я использую для "LD_LIBRARY_PATH" при компиляции моего кода на С++ в Eclipse (я не использую файлы mex, вместо этого я создаю исполняемый файл моего кода на С++ в Eclipse и позже запускаю его из оболочки Matlab). В моем случае значение "LD_LIBRARY_PATH" так велико, потому что мой код на С++ использует расширенные регулярные выражения, библиотеки matlab (libmat, libmx и т.д.), Библиотеку GSL и Armadillo. Если вы не используете все эти библиотеки, достаточно установить setenv ('LD_LIBRARY_PATH', '').
Ответ 7
В Matlab R2015b я сначала переделал libstdc++.so.6
, а затем отредактировал .matlab7rc.sh
, как описано выше, с помощью @lindelof. На моем рабочем столе, с терминала:
locate libstdc++.so.6
В моем случае системная библиотека находится в /usr/lib64
. Тогда
cd /usr/local/matlab/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s /usr/lib64/libstc++.so.6 libstc++.so.6
cd /usr/local/src/matlab/bin/glnxa64/
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s /usr/lib64/libstc++.so.6 libstc++.so.6
Затем отредактируйте .matlab7rc.sh
в {matlabroot}/bin
. Удалите в том же каталоге любой файл mexopts.sh
. Перезапустите Matlab. MEX
ваш файл с нуля (это создаст новый mexopts.sh
файл с новыми настройками. Запустите его с консоли Matlab.
Ответ 8
Если у вас нет доступа root, вы можете попробовать,
LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab