2016-08-18 23 views
3

私はgccで、SUSE上--version 4.9.4のOpenMP +のlinux - GOMP_4.0は

> g++ -std=c++11 -o a.exe -fopenmp ./file.cpp 
> ./a.exe 

./a.exeをOpenMPのを使用するプログラムをコンパイルしようとしてきたが見つかりません/ USR/lib64に/ libgomp.so.1:バージョン `GOMP_4.0' は(./a.exeで必要)

が見つかりません私は「/usr/lib64/libgomp.so.1という名前のファイルを持っています"どうすれば修正できますか?

+0

システムに2つのgnuコンパイラがインストールされている可能性はありますか? – Harald

+0

はい、確かに4.3.xと4.9.4があります(これはgcc -vを書くと表示されます) –

+0

gcc 4.3(OpenMP 4.0をサポートしていない)のlibgompライブラリを使用している可能性があります。 gcc 4.9のlibgompライブラリを使用しています(gccはOpenMP 4.0をサポートしていません)。ディスク内の他のlibgomp.soを検索できますか(またはgcc 4.9のインストールパスの方が良いでしょうか)? – Harald

答えて

5

複数のGCCコンパイラがインストールされているため(4.3と4.9)、GCC 4.9(OpenMP 4.0をサポート)でコンパイルするため、実行時にOSローダーがGCC 4.3ライブラリを使用するためOpenMP 4.0はサポートしていません)。

この問題を回避するために、いくつかの選択肢があります:

  1. は、静的にリンク時に-staticを使用してバイナリをコンパイルします。
  2. O/Sに、古いライブラリではなく適切なライブラリを検索させます。あなたは、あなたのシステムから利用できるlibgompライブラリを一覧表示するコマンド

    find/name -name libgomp.so.1 
    

    を使用し、それがLD_LIBRARY_PATH環境変数に格納されているディレクトリを追加することができます。

  3. 2)の代わりに、リンカーにバイナリを生成して、LD_LIBRARY_PATHが指す場所に加えて、追加の共有ライブラリの場所を知るように指示することもできます。 gccを使用することもできます... -Wl,-rpath -Wl,<dir>/lib(または適用する場合はlibではなくlib64)<dir>はポイント2のディレクトリを参照しています)。
+0

ありがとうございます。 両方のソリューションが動作しますが、LD_LIBRARY_PATHを変更して2番目のものは、ライブラリが静的ライブラリだけに限定されないため、より優れています。 コマンドの動作: > g ++ - 5.2.0 -std = C++ 11 -o a.exe -fopenmp ./a.cpp -Wl、-rpath、$ HOME/gcc/gcc-4.9.4/lib64/ –

+0

はい、-rpathを使用してlibgomp(または他の共有ライブラリ)のLD_LIBRARY_PATHを埋め込むこともできます。そのアプローチは特にきれいです。私はそれで私の答えを更新します。ありがとう! – Harald