Как заставить mex связываться с libstdc ++. 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 в этом сценарии, но это не работает. Так что, если я не использую символическую ссылку, где я могу настроить путьlibstdc++.so.6 что мекс использует? Спасибо.

Ответы на вопрос(8)

где находится мой 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', '') должно быть достаточно.

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

setenv('LD_LIBRARY_PATH', '');

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

П.С .: Я нашел это решениеВот


LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab

Решение Вопроса

чтобы matlab знал, как ее использовать. Что-то вроде:

ln -s {/path/to/file-name} {link-name}

Если вы не хотите использовать символические ссылки, просто определите этот путь в терминале, из которого вы запускаете Matlab:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libstdc++.so.6
./matlab

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

LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH'

или в glnx64:

LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH'

/usr/lib/gcc/i686-linux-gnu/4..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).

 Itamar Katz23 окт. 2014 г., 23:09
Я отредактировал .matlab7rc.sh, чтобы добавить правильный путь (и подтвердил с помощью 'matlab -n', что он действительно появляется перед / sys / os / glnx86 в LD_LIBRARY_PATH) - но я все еще получаю ту же ошибку ... есть подсказка?

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

но я считаю, что самым чистым, наиболее одобренным и наименее инвазивным решением 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, выходящей за рамки официально поддерживаемой, но это безвредно и может быть проигнорировано.

 Itamar Katz23 окт. 2014 г., 22:54
Это казалось идеальным решением для меня, так как я собираю без прав root. На самом деле, набрав 'matlab -n', вы увидите, что путь к моей локальной версии libstdc ++ (из gcc 4.9) является первым в списке LD_LIBRARY_PATH. Тем не менее, вызов my mex по-прежнему вызывает ошибку, которая подразумевает, что matlab все еще пытается загрузить свою собственную libstdc ++ ... какая-нибудь подсказка?
 Itamar Katz02 янв. 2016 г., 14:46
Проблема была в том, что mexopts.sh по-прежнему связан с-lstdc++После удаления я могу скомпилировать mex-файл для локальной версии libstdc ++, и он работает нормально.
 strangeluck24 мар. 2017 г., 23:06
Просто хотел упомянуть, что после новой установки Matlab 2016b на Ubuntu 14.04 я получил ошибку «not find -lstdc ++». Приведенный выше совет ясно дал понять, что мне просто нужно установить g ++. Это также было проверено путем получения ошибка ввода "mex -setup cpp" в приглашении Matlab. Установлена, как показано выше, и даже не нужно было перезапускать Matlab. Спасибо!

Ваш ответ на вопрос