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

Я пытаюсь записать matlab mex функция, которая использует libhdf5; Моя установка Linux обеспечивает, libhdf5-1.8 совместно использовал библиотеки и заголовки. Однако моя версия Matlab, r2007b, обеспечивает libhdf5.so от этих 1,6 выпусков. (Matlab .mat файлы загружают hdf5, очевидно). Когда я компилирую mex, это segfaults в Matlab. Если я понижаю свою версию libhdf5 к 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 находится в моем будущем.). какие-либо идеи?

Править: на превосходные предложения Ramashalanka, меня

A) названный mex -v получить 3 gcc команды; последней является команда компоновщика;

B) названный, что команда компоновщика с a -v добираться collect команда;

C) названный этим 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.

10
задан shabbychef 4 February 2010 в 22:26
поделиться

2 ответа

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

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

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

  3. Явно укажите static 1.8.4 библиотеку, которую вы хотите загрузить (полный путь без -L для нее) и не включайте -lhdf5 в LDFLAGS. Включите опцию -t, чтобы вы могли убедиться, что не загружается динамическая библиотека hdf5. Вам также понадобится -lz, с установленным zlib. Для darwin также нужен -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), так что это определенно решает проблему на моей системе.

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

8
ответ дан 4 December 2019 в 01:00
поделиться

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

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

3
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: