2015-02-09 1 views
1

Я знаю, что есть много сообщений по теме, это может быть дубликат, но я так не думаю. Мой конфиг: Matlab R2014b, clang 3.4, Ubuntu 14.04, armadillo-4.600.4.Недопустимый mex-файл, libarmadillo, не может открыть файл общих объектов

У меня есть локальная установка (не связанная с системой, поэтому включение/привязка вручную) Armadillo, которая отлично работает, когда снаружи Matlab. Я пытаюсь запустить файл Mex с помощью Armadillo из Matlab. Он отлично компилируется с помощью команды (усеченной для краткости):

mex -compatibleArrayDims -outdir +mx -L/home/john/.local/arma/lib -larmadillo -I/home/john/.local/arma/include test_arma.cpp 

проблема, когда я пытаюсь запустить его, я получаю эту ошибку:

Error using mx.test_arma 
Invalid MEX-file '/path/to/+mx/test_arma.mexa64': libarmadillo.so.4: cannot open shared object file: No such file or directory 

переменного окружения LD_LIBRARY_PATH вторят из оболочки, которая началась Matlab содержит /home/john/.local/arma/lib (где libarmadillo.so есть), и я также вручную добавил этот путь в Matlab, используя setenv('LD_LIBRARY_PATH',...). Есть что-то, что мне не хватает?

+1

У меня сейчас нет ссылки, но MATLAB смешно о 'LD_LIBRARY_PATH'. Возможно, сначала попробуйте символическую ссылку. Кроме того, вы уверены, что зависимость, добавленная вами к пути, является 64-разрядной. Я не знаю структуру папок Ubuntu. – chappjc

+0

@chappjc Ваш комментарий о 64-битах интересен, я собираюсь дважды проверить все и перекомпилировать свои разделяемые библиотеки с нуля, чтобы убедиться, что нет никакого несоответствия, потому что, как я уже сказал, я получаю segfaults сейчас, Я уверен, что это не из самого кода. – Sheljohn

ответ

1

Так что я узнал, как запустить. Теперь это segfaulting:/И я уверен, что это не сам код, потому что я могу скомпилировать и запустить тот же самый код вне Matlab. Я постараюсь выяснить, что случилось, и если это уместно, я расскажу о своих приключениях здесь позже.

За бег проблема; кажется, что Matlab использует переменную LD_RUN_PATH для загрузки разделяемых библиотек во время выполнения. Добавление моего пути ... /.local/arma/lib в LD_RUN_PATH с использованием setenv сделал трюк в моем случае. Приветствия за ваши комментарии/ответы!

Update: я, наконец, решил это, проблема была из-за ожидаемое несоответствие слов размера (32/64 бит, т.е. int32_t против int64_t) между BLAS/LAPACK библиотекой MatLab и призывает броненосец. Есть два решения, которые я разместил here.

+1

Ах! Я должен, наконец, запомнить переменную 'LD_RUN_PATH'. Я знал, что в среде MATLAB есть что-то другое, но я редко использую Linux ... +1 Кстати, почему '-compatibleArrayDims'? – chappjc

+0

@chappjc. Новые версии Matlab по умолчанию позволяют использовать '-largeArrayDims' (или что-то подобное) для mex, которые по существу определяют' mwSize' как 'uint64_t'. Я использую свою собственную библиотеку, которая сама использует Armadillo, и сейчас я использую 'uint32_t'. 'compatibleArrayDims' - это просто способ вернуться к« старому способу », и заставить Matlab использовать 32, а не 64 бита для индексирования :) (обратите внимание на это: это может быть причиной моих segfaults, если по какой-то причине это также вызывает Mex ожидает 32 битных библиотек ..) – Sheljohn

+0

Итак, вы используете 32-битные индексы без знака, получили его. Но я думаю, вы имеете в виду, что «unsigned long long» - 64 бит. ;) – chappjc

Смежные вопросы