質問

libhdf5 を使用する matlab mex 関数を作成しようとしています。私の Linux インストールには libhdf5-1.8 共有ライブラリとヘッダーが提供されています。ただし、私のバージョンの Matlab r2007b は、1.6 リリースの libhdf5.so を提供します。(MATLAB .mat ファイルは明らかに hdf5 をブートストラップします)。mex をコンパイルすると、Matlab でセグメンテーション違反が発生します。libhdf5 のバージョンを 1.6 (長期オプションではありません) にダウングレードすると、コードはコンパイルされ、正常に実行されます。

質問:この問題はどうやって解決すればいいのでしょうか?/opt/matlab/bin/glnxa64/libhdf5.so.0 ではなく /usr/lib64/libhdf5.so.6 にリンクするように mex コンパイル プロセスに指示するにはどうすればよいですか?これを使用してこれを実行しようとすると、 -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 バージョンのアップグレードは将来の予定です)。何か案は?

編集:ラマシャランカさんの素晴らしい提案に従って、私は

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

それで、実際には、 libhdf5.so から /usr/lib64 参照されています。ただし、これは環境変数によってオーバーライドされていると思います LD_LIBRARY_PATH, これは、私のバージョンの Matlab が実行時に自動的に設定するため、独自のバージョンを見つけることができます。 libmex.so, 、など。

私は次のように考えています。 crt_file.c この例は、私が使用している関数を使用しなくても動作します(H5DOpen, 、1.6 から 1.8 への移行で署名が変更されました (はい、私は使用しています) -DH5_USE_16_API))、または可能性は低いですが、hdf5 を必要とする Matlab 内部の部分にヒットしません。ああ。

役に立ちましたか?

解決

私のシステムでは次のことが機能しました。

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

  2. 対象ファイルを作成します。すでに独自のファイルがあります。シンプルなものを使いました h5_crtfile.c から ここ (警告を探すために、最初にこの単純なファイルから始めることをお勧めします)。私が変更され mainmexFunction 通常の引数を使用して含まれます mex.h.

  3. を指定します 静的 1.8.4 明示的にロードしたいライブラリ (必要な場合は -L を付けないフルパス) を含めないでください。 -lhdf5 の中に LDFLAGS. 。を含める -t オプションを使用すると、動的 HDF5 ライブラリがロードされていないことを確認できます。こちらも必要です -lz, 、 と zlib インストールされています。ダーウィンの場合は、 -bundleLDFLAGS:

    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_crtfile mexファイル。私のマシンでは問題なく動作します。H5Fcreate と H5Fclose を実行して現在のディレクトリに「file.h5」を作成するだけです。 file file.h5 分かりました file.h5: Hierarchical Data Format (version 5) data.

を含めると、 -lhdf5 上記のステップ 3 で実行可能ファイルを実行しようとすると、MATLAB が中止されます (MATLAB の動的ライブラリ (私にとってはバージョン 1.6.5) が使用されるため)。したがって、これで私のシステムの問題は間違いなく解決されます。

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

他のヒント

完全を期すためにここに投稿する正確な解決策に導かれたので、私はラマシャランカの答えを受け入れます。

  1. hdf5 Web サイトから hdf5-1.6.5 ライブラリをダウンロードし、ヘッダー ファイルをローカル ディレクトリにインストールします。
  2. mex に、標準の場所 (例: /usr/include.)
  3. 私のコードをコンパイルするように私に伝えてください および matlab によって提供される共有オブジェクト ライブラリ, 、 そして、やります ない 使用 -ldfh5 フラグを立てる LDFLAGS.

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

/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 を使用していると思われる matlab r2009a にアップグレードするまでは、さまざまなターゲット マシンすべてで動作するはずです。すべての助けに感謝します。内容が濃すぎて申し訳ありません。ヘッダー ファイルのローカル セットではなく、hdf5 のパッケージ バージョンを使用することにこだわりすぎていたと思います。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top