我正在尝试编写一个使用 libhdf5 的 matlab mex 函数;我的 Linux 安装提供了 libhdf5-1.8 共享库和标头。然而,我的 Matlab 版本 r2007b 提供了 1.6 版本的 libhdf5.so。 (Matlab.mat
文件 bootstrap hdf5,显然)。当我编译 mex 时,它在 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
确认。最后的手段是下载 hdf5-1.6.5 标头的本地副本并使用它,但这不是面向未来的(Matlab 版本升级是我的未来。)。有任何想法吗?
编辑:根据 Ramashalanka 的出色建议,我
A)被称为mex -v
得到 3gcc
命令;最后是链接器命令;
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
from /usr/lib64
正在被引用。然而,我相信,这是被环境变量覆盖的LD_LIBRARY_PATH
,我的 Matlab 版本会在运行时自动设置,以便它可以找到自己的版本,例如libmex.so
, etc.
我认为crt_file.c
示例可以工作 b/c 它不使用我正在使用的功能(H5DOpen
,从 1.6 到 1.8 的过程中有一个签名更改(是的,我正在使用-DH5_USE_16_API
)),或者,不太可能,b/c 它没有触及 Matlab 内部需要 hdf5 的部分。确认。