Общие местоположения библиотеки для файлов MATLAB MEX:

StackOverflow https://stackoverflow.com/questions/2188658

  •  25-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать функцию MATLAB MEX, которая использует libhdf5; My Linux Установка предоставляет общие библиотеки LibhDF5-1.8. Однако моя версия MATLAB R2007B предоставляет libhdf5.so из выпуска 1.6. (Матлаб. .mat Файлы загрузки HDF5, очевидно,). Когда я компилирую Mex, он SegFaults в Matlab. Если я понизую мою версию BIBHDF5 до 1.6 (не долгосрочный вариант), код компилирует и работает нормально.

Вопрос: Как мне решить эту проблему? Как мне сообщить процесс компиляции MEX для связи против /usr/lib64/libhdf5.so.6 вместо /opt/matlab/bin/glnxa64/libhdf5.so.0? Когда я пытаюсь сделать это, используя -Wl,-rpath-link,/usr/lib64 В моей компиляции я получаю ошибки, как:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

    mex: link of 'hdf5_read_strings.mexa64' failed.

make: *** [hdf5_read_strings.mexa64] Error 1

ack. Последний курорт будет скачать локальную копию заголовков HDF5-1.6.5 и сделать с ним, но это не будущее доказательство (обновление версии MATLAB находится в моем будущем.). есть идеи?

Отредактируйте: на превосходные предложения Рамашаланки, я

А) называется mex -v Чтобы получить 3 gcc команды; последний - это команда линкера;

Б) назвал эту команду линкера с -v чтобы получить collect команда;

В) назвал это collect2 -v -t и остальные флаги.

Соответствующие части моего выхода:

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so)
-lstdc++ (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so)
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crtn.o

Итак, на самом деле libhdf5.so от /usr/lib64 называется. Тем не менее, это преодолено, я полагаю, по переменной окружающей среде LD_LIBRARY_PATH, в которой моя версия MATLAB автоматически устанавливает во время выполнения, так что можно найти свои собственные версии, например, libmex.so, так далее.

Я думаю, что crt_file.c Пример работает либо B / C, он не использует функции, которые я использую (H5DOpen, у которых есть изменение подписи в шаге с 1,6 до 1,8 (да, я использую -DH5_USE_16_API)) или, менее вероятно, B / C он не попадает в частей внутренних органов Matlab, которые нуждаются в HDF5. ack.

Это было полезно?

Решение

В моем системе работает следующее:

  1. Установите HDF5 версии 1.8.4 (вы уже сделали это: я установил источник и скомпилирован, чтобы убедиться, что он совместим с моей системой, что я получаю версии GCC и что я получаю статические библиотеки, например, двоичные файлы, предлагаемые для моей системы, icc специфический).

  2. Сделайте целевой файл. У вас уже есть свой собственный файл. Я использовал простой h5_crtfile.c от здесь (Хорошая идея начать с этого простого файла сначала поиск предупреждений). я изменил main к mexFunction с обычными аргументами и включены mex.h.

  3. Укажите статический 1.8.4 Библиотека, которую вы хотите загрузить явно (полный путь без необходимости не нужна) и не включать -lhdf5 в LDFLAGS. Отказ Включить А. -t Опция, так что вы можете убедиться, что не будет загружена динамическая библиотека HDF5. Вы также нуждаетесь -lz, с участием zlib установлены. Для Дарвина нам также нужен -bundle в LDFLAGS:

    mex CFLAGS='-I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -bundle' h5_crtfile.c -v
    

    Для Linux вам нужен эквивалентный независимый от позиции вызов, например, fPIC и возможно -shared, но у меня нет системы Linux с лицензией MatLab, поэтому я не могу проверить:

    mex CFLAGS='-fPIC -I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -shared' h5_crtfile.c -v
    
  4. Запустить h5_crtfile файл mex. Это работает без проблем на моей машине. Он просто делает H5FCreate и H5FClose для создания «File.H5» в текущем каталоге, и когда я звоню file file.h5 я получил file.h5: Hierarchical Data Format (version 5) data.

Обратите внимание, что если я включил -lhdf5 Выше на шаге 3, затем MatLab прерваний, когда я пытаюсь запустить исполняемый файл (потому что он использует динамические библиотеки Matlab, которые для меня - версия 1.6.5), поэтому это определенно решает проблему в моей системе.

Спасибо за вопрос. Мое решение выше, безусловно, намного легче для меня, чем то, что я делал раньше. Надеюсь, вышесказанное работает для вас.

Другие советы

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

  1. Загрузите библиотеку HDF5-1.6.5 с веб-сайта HDF5 и установите файлы заголовка в локальный каталог;
  2. Скажите MEX, чтобы найти «HDF5.H» в этом локальном каталоге, а не в стандартном месте (например, /usr/include.)
  3. Скажите MEX, чтобы скомпилировать мой код и библиотека общих объектов, предоставленная MatLab, и делай нет использовать -ldfh5 флаг внутри LDFLAGS.

Команда, которую я использовал, по сути:

/opt/matlab/matlab_default/bin/mex -v CC#gcc CXX#g++ CFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include" CXXFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include " -O -lmwblas -largeArrayDims -L/usr/lib64 hdf5_read_strings.c /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0

Это переводится MEX в команды:

gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG hdf5_read_strings.c
gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG /opt/matlab/matlab75/extern/src/mexversion.c
gcc -O -pthread -shared -Wl,--version-script,/opt/matlab/matlab75/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o hdf5_read_strings.mexa64  hdf5_read_strings.o mexversion.o  -lmwblas -L/usr/lib64 /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0 -Wl,-rpath-link,/opt/matlab/matlab_default/bin/glnxa64 -L/opt/matlab/matlab_default/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++

Это решение должно работать на всех моих различных целевых машинах и, по крайней мере, пока я не обновляю до MATLAB R2009A, что я считаю, использует HDF5-1.8. Спасибо за всю помощь, извините за то, что настолько густым с этим - я думаю, что я был чрезмерно обязан использовать упакованную версию HDF5, а не локальный набор файлов заголовка.

Примечание. Это все было бы тривиально, если MathWorks предоставила набор файлов заголовка с распределением MATLAB ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top