15

最近、ubuntu マシンにhdf5ライブラリをインストールしましたが、エクスポートされた関数へのリンクに問題があります。この問題を説明するために、簡単なテスト スクリプトreadHDF.cppを作成しました。

#include <hdf5.h>

int main(int argc, char * argv[])
{
  hid_t     h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
  return 0;
}

コンパイルコマンドは

g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
    -L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp

次のエラーを返します

/tmp/cc6DXdxV.o: In function `main':  
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version'  
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen'  
collect2: ld returned 1 exit status

nmコマンドは、関数がエクスポートされたと言っているように見えるため、混乱しています。

nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version

返す

0000000000034349 T H5check_version

についても同様の結果ですH5Fopen。何がうまくいかないのかについて何か考えはありますか?それが役立つかどうかはわかりませんが、スクリプトの一部をコメントアウトすると、H5Fopen正常にコンパイルされます。

#include <hdf5.h>

int main(int argc, char * argv[])
{
hid_t     h5_file_id;// = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}

また、h5py やテーブルなどのさまざまな python モジュールで使用される hdf5 の複数のバージョンがサーバーにインストールされていますが、それらのいずれも動作させることができなかったため、このバージョンをローカル ディレクトリにインストールし、rpath オプションを変更しました。 g++ リンカ用。

4

3 に答える 3

35

わかりました、解決しました。問題は、コンパイルコマンドでの-lhdf5の配置にありました。どうやら-lhdf5はreadHDF.cppの後に配置する必要があります。たとえばg++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5、問題なくコンパイルされますがg++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp、未定義の参照エラーで失敗します。興味深いことに、両方のコンパイルコマンドがUbuntu 10.04で機能したため、これはUbuntu12.04でのみ問題でした。

この投稿で説明付きの答えを見つけました:

nmがこのシンボルが存在することを示している場合でも、シンボルへの未定義の参照

スクリプトの後に-lXXXを配置する方が安全だと思います。

于 2013-02-16T22:26:11.230 に答える
6

これはバグではありません。「FooClass::SayHello()」への C++ 共有ライブラリの未定義参照を参照してください 。

「GCC の最近のバージョンでは、オブジェクト ファイルとライブラリを相互に依存する順序で配置する必要があります ...」

于 2014-03-25T00:51:08.130 に答える
0

-lhdf5コンパイルコマンドを入れるのを忘れました。また、必要はありません-l:$HOME/hdf5/lib/libhdf5.so

これはうまくいくはずです:$ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp

于 2013-02-16T00:02:22.180 に答える