gpt4 book ai didi

gcc - matlab mex 文件的共享库位置 :

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:57 25 4
gpt4 key购买 nike

我正在尝试编写一个使用 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 header 的本地副本并完成它,但这不是 future 的证明(Matlab 版本升级是在我的 future 。)。有什么想法吗?

编辑:根据 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 内部部件。确认。

最佳答案

以下在我的系统上有效:

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

  2. 制作一个目标文件。你已经有了自己的文件。我使用了 here 中的简单 h5_crtfile.c (一个好主意是从这个简单的文件开始,先查找警告)。我将 main 更改为带有常用参数的 mexFunction 并包含了 mex.h

  3. 指定要显式加载的static 1.8.4 库(没有必要的 -L 的完整路径)并且不包含 -lhdf5LDFLAGS 中。包含一个 -t 选项,这样您就可以确保没有加载动态 hdf5 库。您还需要安装了 -lzzlib。对于 darwin,我们还需要 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 系统,所以我无法检查:

    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)数据

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

感谢您的提问。我上面的解决方案对我来说肯定比我以前做的要容易得多。希望以上内容对您有用。

关于gcc - matlab mex 文件的共享库位置 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com