登录论坛

查看完整版本 : matlab mex文件的共享库位置:


poster
2019-12-10, 20:30
我正在尝试编写一个使用libhdf5的matlab mex函数;我的Linux安装提供了libhdf5-1.8共享库和标头。但是,我的Matlab版本r2007b从1.6版本开始提供了libhdf5.so。 (显然,Matlab .mat文件引导了hdf5)。当我编译mex时,在Matlab中它会出现段错误。如果我将libhdf5的版本降级到1.6(不是长期选项),则代码可以编译并运行良好。

问题:如何解决此问题?如何告诉mex编译过程链接到/usr/lib64/libhdf5.so.6而不是/opt/matlab/bin/glnxa64/libhdf5.so.0?当我尝试在编译中使用-Wl,-rpath-link,/usr/lib64来执行此操作-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)用-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 因此,实际上正在引用/usr/lib64的libhdf5.so 。但是,我相信环境变量LD_LIBRARY_PATH已覆盖了该变量,我的Matlab版本在运行时自动设置了该变量,以便可以找到自己的版本,例如libmex.so等。

我认为crt_file.c示例可以使用b / c而不使用我正在使用的功能( H5DOpen ,它在从1.6到1.8的过程中发生了签名更改(是的,我正在使用-DH5_USE_16_API )),或者,不太可能,b / c不会影响需要hdf5的Matlab内部零件。 ack。



回答:

以下在我的系统上工作:


安装hdf5版本1.8.4(您已经完成了此操作:安装了源代码并进行编译,以确保它与我的系统兼容,获得gcc版本并获得静态库-例如,为系统提供的二进制文件是特定于icc )。

制作目标文件。您已经有自己的文件。我从这里 (http://www.hdfgroup.org/HDF5/Tutor/examples/C/h5_crtfile.c)使用了简单的h5_crtfile.c从这个简单的文件开始,首先要查找警告,这是一个好主意)。我使用通常的args将main更改为mexFunction ,并包含了mex.h

指定要显式加载的静态 1.8.4库(完整路径,必要时不带-L),并且不要在LDFLAGS包含-lhdf5 。包括-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 ,但是我没有具有matlab许可证的linux系统,所以我无法检查:

mex CFLAGS='-fPIC -I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -shared' h5_crtfile.c -v
运行h5_crtfile mex文件。这在我的机器上运行没有问题。它只是执行H5Fcreate和H5Fclose在当前目录中创建“ file.h5”,当我调用file file.h5我得到了file.h5: Hierarchical Data Format (version 5) data 。

请注意,如果我在第3步中包含-lhdf5 ,则当我尝试运行可执行文件时,matlab将中止(因为它随后使用了matlab的动态库,对我来说,该库是1.6.5版),因此,这肯定可以解决我的问题系统。

谢谢你的问题。对于我来说,上述解决方案绝对比以前做起来容易得多。希望以上内容对您有用。



更多&回答... (https://stackoverflow.com/questions/2188658)