matlab mex文件的共享库位置:

sha*_*hef 10 matlab gcc rpath hdf5 mex

我正在尝试编写一个使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以,实际上是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它没有击中需要hdf5的Matlab内部部件.ACK.

Ram*_*nka 8

以下是我的系统:

  1. 安装hdf5版本1.8.4(你已经完成了这个:我安装了源代码并进行了编译以确保它与我的系统兼容,我获得了gcc版本并获得了静态库 - 例如为我的系统提供的二进制文件是icc具体).

  2. 制作目标文件.您已拥有自己的文件.我h5_crtfile.c这里使用了简单(一个好主意,首先从这个简单的文件开始查看警告).我换mainmexFunction与通常的指定参数和包括mex.h.

  3. 指定要显式加载的静态 1.8.4库(必须没有-L的完整路径)并且不包含-lhdf5LDFLAGS.包含一个-t选项,以确保没有加载动态hdf5库.您还需要-lzzlib安装.达尔文我们还需要一个-bundleLDFLAGS:

    mex CFLAGS='-I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -bundle' h5_crtfile.c -v
    
    Run Code Online (Sandbox Code Playgroud)

    对于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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 运行h5_crtfilemex文件.这在我的机器上运行没有问题.它只是在当前目录中创建一个H5Fcreate和H5Fclose来创建"file.h5",当我打电话给file file.h5我时file.h5: Hierarchical Data Format (version 5) data.

请注意,如果我-lhdf5在步骤3中包含上面的内容,那么当我尝试运行可执行文件时,matlab就会中止(因为它然后使用了matlab的动态库,对我来说是版本1.6.5),所以这肯定解决了我的系统上的问题.

谢谢你的提问.对我来说,上面的解决方案对我来说比以前更容易.希望以上适合您.