10

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最後はリンカーコマンドです。

-vB)コマンドを取得するためにそのリンカーコマンドを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.sofrom/usr/lib64が参照されています。ただし、これは環境変数によってオーバーライドされていると思います。環境変数は、私のバージョンのMatlabが実行時に自動的に設定するため、たとえば、などLD_LIBRARY_PATHの独自のバージョンを見つけることができます。libmex.so

このcrt_file.c例は、私が使用している関数を使用していないb / c(H5DOpen1.6から1.8への移行で署名が変更された(はい、私は使用しています-DH5_USE_16_API))、または可能性は低いですがb/のいずれかで機能すると思います。 chdf5を必要とするMatlab内部の部分にはヒットしません。ack。

4

2 に答える 2

9

以下は私のシステムで動作しました:

  1. hdf5バージョン1.8.4をインストールします(すでにこれを行っています:ソースをインストールし、システムとの互換性を確認するためにコンパイルしました。gccバージョンを取得し、静的ライブラリを取得します。たとえば、システムに提供されているバイナリは次のとおりです。icc明確)。

  2. ターゲットファイルを作成します。あなたはすでにあなた自身のファイルを持っています。ここh5_crtfile.cから単純なものを使用しました(最初にこの単純なファイルから始めて警告を探すことをお勧めします)。通常の引数でに変更し、を含めました。mainmexFunctionmex.h

  3. 明示的にロードする静的1.8.4ライブラリ(必要に応じて-Lを含まないフルパス)を指定し、に含めない-lhdf5でくださいLDFLAGS。オプションを含めて、-t動的hdf5ライブラリがロードされていないことを確認できるようにします。-lzまた、がインストールされている必要がありますzlib-bundleダーウィンの場合は、次のものも必要ですLDFLAGS

    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_crtfilemexファイルを実行します。これは私のマシンでは問題なく実行されます。H5FcreateとH5Fcloseを実行して、現在のディレクトリに「file.h5」を作成します。呼び出すfile file.h5と、が表示されますfile.h5: Hierarchical Data Format (version 5) data

手順3に上記を含める-lhdf5と、実行可能ファイルを実行しようとするとmatlabが異常終了することに注意してください(バージョン1.6.5であるmatlabのダイナミックライブラリを使用するため)。これにより、システムの問題が確実に解決されます。

質問ありがとうございます。上記の私の解決策は、私が以前行っていたものよりも間違いなくはるかに簡単です。うまくいけば、上記があなたのために働く。

于 2010-02-02T23:59:45.723 に答える
3

私はRamashalankaの答えを受け入れています。それは、完全を期すためにここに投稿する正確な解決策に私を導いたからです。

  1. hdf5 Webサイトからhdf5-1.6.5ライブラリをダウンロードし、ローカルディレクトリにヘッダーファイルをインストールします。
  2. mexに、標準の場所ではなく、このローカルディレクトリで「hdf5.h」を探すように指示します(例/usr/include)。
  3. mexに、コードとmatlabが提供する共有オブジェクトライブラリをコンパイルするように指示し、のフラグは使用しないでください。-ldfh5LDFLAGS

私が使用したコマンドは、基本的に次のとおりです。

/opt/matlab/matlab_default/bin/mex -v CC#gcc CXX#g++ CFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include" CXXFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include " -O -lmwblas -largeArrayDims -L/usr/lib64 hdf5_read_strings.c /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0

これはmexによってコマンドに変換されます:

gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG hdf5_read_strings.c
gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG /opt/matlab/matlab75/extern/src/mexversion.c
gcc -O -pthread -shared -Wl,--version-script,/opt/matlab/matlab75/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o hdf5_read_strings.mexa64  hdf5_read_strings.o mexversion.o  -lmwblas -L/usr/lib64 /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0 -Wl,-rpath-link,/opt/matlab/matlab_default/bin/glnxa64 -L/opt/matlab/matlab_default/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++

このソリューションは、私のさまざまなターゲットマシンすべてで機能し、少なくとも、hdf5-1.8を使用していると思われるmatlabr2009aにアップグレードするまでは機能するはずです。すべての助けに感謝します、これでとても密集して申し訳ありません-私はヘッダーファイルのローカルセットではなく、hdf5のパッケージ化されたバージョンを使用することに過度にコミットしたと思います。

MathworksがMatlabディストリビューションでヘッダーファイルのセットを提供していれば、これはすべて些細なことであったことに注意してください...

于 2010-02-09T18:12:57.537 に答える