Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在尝试编写一个使用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。 回答: 以下在我的系统上工作:
谢谢你的问题。对于我来说,上述解决方案绝对比以前做起来容易得多。希望以上内容对您有用。 更多&回答... |
![]() |
![]() |