问题:我该如何解决这个问题?我该如何告诉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的本地头文件,但这并不具有未来性(我将来会升级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
示例要么不使用我正在使用的函数(H5DOpen
在从1.6移动到1.8时有一个签名更改(是的,我正在使用-DH5_USE_16_API
)),要么不太可能击中需要hdf5的Matlab内部部分。
lib64/libhdf5.so
这个动态库。您需要为静态库指定显式路径(带有.o
后缀),而不是使用-lhdf5
。如果还没有工作,请发布新的链接器输出。如果.so
文件是列表中唯一的文件,则只包括该文件。如果您没有-lhdf5
选项并且显式指定了静态库的路径(见下文),则LD_LIBRARY_PATH
或任何其他路径(例如-L
中的路径)都不应该成问题。我同意您对h5_crtfile.c
的评论,但我们需要的所有信息都在上面的链接器输出中。 - Ramashalankalibhdf5.o
و–‡ن»¶ï¼›gentooçڑ„hdf5软ن»¶هŒ…وڈگن¾›ن؛†libhdf5.so
م€پlibhdf5.a
م€پlibhdf5.la
ن»¥هڈٹن¸€ن؛›Fortranه’ŒC++و–‡ن»¶م€‚وˆ‘需è¦پè‡ھه·±ç¼–译libhdf5هگ—ï¼ںè؟™وک¯ن¸€ن¸ھ选é،¹... - shabbychef.a
而不是.o
。你可以通过strings libhdf5.a
等方式检查你拥有的libhdf5.a
文件是否为正确版本。我在我的文件中看到了HDF5 Version: 1.8.4
。如果你无法获得正确的静态库作为二进制文件,那么编译也很容易。请参见我对你其他问题的评论。 - Ramashalankastrings /usr/lib64/libhdf5.a | grep 'library version'
将会输出以下内容:"HDF5 library version: 1.8.4 HDF5 library version: 1.8.4 ..." 我无法链接静态库,原因不明。同样的警告-fPIC
。 - shabbychef-bundle
,我会发现与您遇到的相同的“undefined reference to 'main'”错误。因此,在调用mex时,您需要在系统上使用等效的-bundle
。从手册中看来,似乎-fPIC
(或-fpic
)作为CFLAG
和(也许)-shared
作为LDFLAG
。是的,您的头文件和库确实似乎是正确的版本。我怀疑您不需要重新编译hdf5
以使用-fPIC
,因为在我的系统上,使用-bundle
一切都正常。 - Ramashalanka