我想寫一個使用libhdf5的matlab mex函數;我的Linux安裝提供了libhdf5-1.8共享庫和頭文件。不過,我的Matlab版本r2007b在1.6版本中提供了libhdf5.so。 (顯然,Matlab .mat
文件bootstrap hdf5)。當我編譯mex時,它在Matlab中進行段錯誤。如果我將我的libhdf5版本降級到1.6(不是長期選項),代碼編譯並運行良好。共享庫位置爲matlab mex文件:
問題:我該如何解決這個問題?如何告訴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
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
例如,c它不使用我使用的是的,我使用的功能(H5DOpen
,其中有從1.6遷移到1.8的簽名更改(無論是工作B/-DH5_USE_16_API
)),或者不太可能,b/c它不會碰到需要hdf5的Matlab內部部分。 ACK。
在輸出我看到'lib64的/ libhdf5.so'這是一個動態庫。您需要爲靜態庫指定顯式路徑(帶有.o後綴),而不是使用「-lhdf5」。然後發佈新的鏈接器輸出,如果它仍然沒有工作。如果'.so'文件是列表中唯一的文件,那麼這是唯一包含的文件。如果你沒有'-lhdf5'作爲選項,並且你明確指定了靜態庫的路徑(見下文),'LD_LIBRARY_PATH'或者任何其他的路徑,比如'-L'中的路徑應該沒有問題。我同意你對'h5_crtfile.c'的評論,但是我們需要的所有信息都在上面的鏈接器輸出中。 – Ramashalanka 2010-02-05 00:43:01
我沒有'libhdf5.o'文件; gentoo的hdf5包提供'libhdf5.so','libhdf5.a','libhdf5.la',以及一些fortran和cpp文件。我必須自己編譯libhdf5嗎?這是一個選項... – shabbychef 2010-02-05 01:16:28
對不起,我的意思是'.a',而不是'.o'。你可以檢查你的libhdf5.a文件是否是正確的版本。 '字符串libhdf5.a'。我在我的視頻中看到了'HDF5 Version:1.8.4'。如果無法將正確的靜態庫作爲二進制文件獲取,則編譯起來很容易。在下面查看我的評論。 – Ramashalanka 2010-02-05 01:28:52