libhdf5を使用するmatlabmex関数を作成しようとしています。私のLinuxインストールでは、libhdf5-1.8共有ライブラリとヘッダーが提供されます。ただし、私のバージョンのMatlabであるr2007bは、1.6リリースのlibhdf5.soを提供します。(Matlab.mat
ファイルは明らかにhdf5をブートストラップします)。mexをコンパイルすると、Matlabでsegfaultが発生します。libhdf5のバージョンを1.6にダウングレードすると(長期的なオプションではありません)、コードはコンパイルされて正常に実行されます。
質問:この問題を解決するにはどうすればよいですか?mexコンパイルプロセスに/opt/matlab/bin/glnxa64/libhdf5.so.0ではなく/usr/lib64/libhdf5.so.6に対してリンクするように指示するにはどうすればよいですか?コンパイルでこれを使用しようとすると-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) 3つのコマンドmex -v
を取得するために呼び出されます。gcc
最後はリンカーコマンドです。
-v
B)コマンドを取得するためにそのリンカーコマンドをaで呼び出しました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
したがって、実際にはlibhdf5.so
from/usr/lib64
が参照されています。ただし、これは環境変数によってオーバーライドされていると思います。環境変数は、私のバージョンのMatlabが実行時に自動的に設定するため、たとえば、などLD_LIBRARY_PATH
の独自のバージョンを見つけることができます。libmex.so
このcrt_file.c
例は、私が使用している関数を使用していないb / c(H5DOpen
1.6から1.8への移行で署名が変更された(はい、私は使用しています-DH5_USE_16_API
))、または可能性は低いですがb/のいずれかで機能すると思います。 chdf5を必要とするMatlab内部の部分にはヒットしません。ack。