Как сказать 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