Как заставить mex связываться с libstdc ++. So.6 в / usr / lib, а не в каталоге MATLAB? - PullRequest
12 голосов
/ 01 апреля 2012

Теперь 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)

By strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX' Я подтверждаю, что у этого libstdc++.so.6 есть эта версия версии.Я просмотрел mexopts.sh и изменил переменные $RPATH и $MLIBS в этом скрипте, но он не работает.Так что, если я не использую символическую ссылку, где я могу настроить путь к libstdc++.so.6, который использует mex?Спасибо.

Ответы [ 8 ]

12 голосов
/ 01 апреля 2012

/ 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).

10 голосов
/ 01 апреля 2012

Вам нужно создать символическую ссылку на библиотеку 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
8 голосов
/ 29 ноября 2013

Это поздний ответ, но я считаю, что самое чистое, наиболее одобренное Mathworks и наименее инвазивное решение - это редактирование сценария .matlab7rc.sh.Это скрипт, используемый скриптом matlab при запуске MATLAB в UNIX-подобных системах.(См. http://www.mathworks.ch/ch/help/matlab/ref/matlabunix.html)

Скопируйте этот сценарий (находится под {matlabroot}/bin) в корневой каталог вашего проекта или в домашний каталог. Затем скажите MATLAB, что сначала выполните поиск в системных каталогах библиотек C ++, вместо этогосвоих каталогов. В моей системе я изменил строку 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, выходящей за рамки официально поддерживаемой, но это безвредно и может быть проигнорировано.

2 голосов
/ 16 июля 2013

Вы можете изменить ~/.matlab/R2012a/mexopts.sh, сгенерированный после выполнения mex -setup, добавив строку в разделе glnx86:

LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH'

или в glnx64:

LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH'
2 голосов
/ 15 июня 2013

Я попробовал оба ответа .. но у меня не получилось ни одного.

однако это сработало для меня. в Matlab запустить это -

setenv('LD_LIBRARY_PATH', '');

только для тех, кто сталкивается с той же проблемой.

P.S .: Я нашел это решение здесь

0 голосов
/ 10 августа 2017

Если у вас нет доступа с правами root, вы можете попробовать,
LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab

0 голосов
/ 15 августа 2016

На 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.

0 голосов
/ 24 июля 2013

Мне не удалось найти, где находится моя libstdc ++. 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' при компиляции моего кода C ++ в Eclipse (я не использую mex-файлы, вместо этого я создаю исполняемый файл моего кода C ++ в Eclipse, а затем запускаю его из оболочки Matlab). В моем случае значение 'LD_LIBRARY_PATH' такое длинное, потому что мой код на C ++ использует регулярные выражения boost, библиотеки matlab (libmat, libmx и т. Д.), Библиотеку GSL и Armadillo. Если вы не используете все эти библиотеки, я думаю, setenv ('LD_LIBRARY_PATH', '') должно быть достаточно.

...