本文介绍了共享库位置为matlab 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:警告:/opt/matlab/matlab75/bin/glnxa64/libmat.so所需的libhdf5.so.0可能与libhdf5.so.6冲突
/ usr / lib / gcc / x86_64-pc-linux-gnu / 4.3.4 /../../../../ lib64 / crt1.o:函数`_start':
(.text + 0x20):undefined引用`main'
collect2:ld返回1退出状态

mex:'hdf5_read_strings.mexa64'的链接失败。

make:*** [hdf5_read_strings.mexa64]错误1

ack 。最后的办法是下载hdf5-1.6.5头文件的本地副本并完成它,但这不是未来的证明(我将来会进行一次Matlab版本升级)。任何想法?编辑:根据Ramashalanka的出色建议,我

(一个好主意,首先从这个简单的文件开始寻找警告)。我用通常的参数将 main 更改为 mexFunction ,并包含 mex.h

  • 指定要显式加载的 static 1.8.4库(不带-L的完整路径它是必需的),并且在 LDFLAGS 中不包含 -lhdf5 。包含 -t 选项,以确保没有加载动态hdf5库。您还需要安装 -lz ,并安装 zlib 。对于达尔文,我们还需要 LDFLAGS 中的 -bundle :

      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系统,所以我可以' t检查:

      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 时,我得到文件。 h5:分层数据格式(版本5)数据。


  • 在步骤3中上面的 -lhdf5 ,然后当我尝试运行可执行文件时(因为它使用了matlab的动态库,这对我来说是1.6.5版本),matlab会中止这绝对是解决我系统上的问题。



    感谢您的提问。上面的解决方案对我来说肯定比我之前做的更容易。希望以上的作品适合你。


    I am trying to write a matlab mex function which uses libhdf5; My Linux install provides libhdf5-1.8 shared libraries and headers. However, my version of Matlab, r2007b, provides a libhdf5.so from the 1.6 release. (Matlab .mat files bootstrap hdf5, evidently). When I compile the mex, it segfaults in Matlab. If I downgrade my version of libhdf5 to 1.6 (not a long-term option), the code compiles and runs fine.

    question: how do I solve this problem? how do I tell the mex compilation process to link against /usr/lib64/libhdf5.so.6 instead of /opt/matlab/bin/glnxa64/libhdf5.so.0 ? When I try to do this using -Wl,-rpath-link,/usr/lib64 in my compilation, I get errors like:

    /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. the last resort would be to download a local copy of the hdf5-1.6.5 headers and be done with it, but this is not future proof (a Matlab version upgrade is in my future.). any ideas?

    EDIT: per Ramashalanka's excellent suggestions, I

    A) called mex -v to get the 3 gcc commands; the last is the linker command;

    B) called that linker command with a -v to get the collect command;

    C) called that collect2 -v -t and the rest of the flags.

    The relevant parts of my output:

    /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
    

    So, in fact the libhdf5.so from /usr/lib64 is being referenced. However, this is being overriden, I believe, by the environment variable LD_LIBRARY_PATH, which my version of Matlab automagically sets at run-time so it can locate its own versions of e.g. libmex.so, etc.

    I am thinking that the crt_file.c example works either b/c it does not use the functions I am using (H5DOpen, which had a signature change in the move from 1.6 to 1.8 (yes, I am using -DH5_USE_16_API)), or, less likely, b/c it does not hit the parts of Matlab internals that need hdf5. ack.

    解决方案

    The following worked on my system:

    1. Install hdf5 version 1.8.4 (you've already done this: I installed the source and compiled to ensure it is compatible with my system, that I get gcc versions and that I get the static libraries - e.g. the binaries offered for my system are icc specific).

    2. Make a target file. You already have your own file. I used the simple h5_crtfile.c from here (a good idea to start with this simple file first a look for warnings). I changed main to mexFunction with the usual args and included mex.h.

    3. Specify the static 1.8.4 library you want to load explicitly (the full path with no -L for it necessary) and don't include -lhdf5 in the LDFLAGS. Include a -t option so you can ensure that there is no dynamic hdf5 library being loaded. You also need -lz, with zlib installed. For darwin we also need a -bundle in LDFLAGS:

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

      For linux, you need an equivalent position-independent call, e.g. fPIC and maybe -shared, but I don't have a linux system with a matlab license, so I can't check:

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

    4. Run the h5_crtfile mex file. This runs without problems on my machine. It just does a H5Fcreate and H5Fclose to create "file.h5" in the current directory, and when I call file file.h5 I get file.h5: Hierarchical Data Format (version 5) data.

    Note that if I include a -lhdf5 above in step 3, then matlab aborts when I try to run the executable (because it then uses matlab's dynamic libraries which for me are version 1.6.5), so this is definitely solving the problem on my system.

    Thanks for the question. My solution above is definitely much easier for me than what I was doing before. Hopefully the above works for you.

    这篇关于共享库位置为matlab mex文件:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

    08-06 09:49