web-dev-qa-db-ja.com

MPI-共有ライブラリの読み込み中にエラーが発生しました

私が直面した問題はここで解決されました: open-mpi/mpi-runでの共有ライブラリの読み込み

インストール自体が必要な-L引数を指定している場合、LD_LIBRARY_PATHを設定するか-x LD_LIBRARY_PATHを指定すると問題が解決する方法がわかりません。私のインストールは~/mpi/にあります

コンパイルリンク構成も含めました。

$ mpic++ -showme:version 
mpic++: Open MPI 1.6.3 (Language: C++)

$ mpic++ -showme
g++ -I/home/vigneshwaren/mpi/include -pthread -L/home/vigneshwaren/mpi/lib
-lmpi_cxx -lmpi -ldl -lm -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl

$ mpic++ -showme:libdirs
/home/vigneshwaren/mpi/lib

$ mpic++ -showme:libs
mpi_cxx mpi dl m rt nsl util m dl    % Notice mpi_cxx here %

mpic++ <file>でコンパイルし、mpirun a.outで実行すると、(共有ライブラリ)リンカーエラーが発生しました

error while loading shared libraries: libmpi_cxx.so.1: 
cannot open shared object file: No such file or directory

LD_LIBRARY_PATHを設定することで、エラーを修正しました。問題は、どのように、そしてなぜですか?何が足りないのですか?インストールが正常に見えるのに、なぜLD_LIBRARY_PATHが必要なのですか。

8
Vigneshwaren

libdllibmlibrtlibnsl、およびlibutilはすべて、システム全体に不可欠なライブラリであり、非常に基本的なライブラリの一部として提供されます。 OSのインストール。 libmpilibmpi_cxxはOpen MPIインストールの一部であり、あなたの場合、リンカー検索パスに明示的に含める必要がある非標準の場所にありますLD_LIBRARY_PATH

Open MPIコンパイララッパーの構成を変更して、-rpathオプションをリンカーに渡すようにすることができます。-rpathはライブラリパスを取得し、それに追加します。実行可能ファイル内に格納されたリスト。ランタイムリンクエディタ(別名ダイナミックリンカ)に、LD_LIBRARY_PATH変数を参照する前にライブラリを検索する場所を指示します。たとえば、次のオプションで十分です。

-Wl,-rpath,/home/vigneshwaren/mpi/lib

これにより、Open MPIライブラリへのパスが実行可能ファイル内に埋め込まれ、そのパスが実行時にLD_LIBRARY_PATHの一部であるかどうかは問題になりません。

対応するラッパーがコンパイラフラグのリストにそのオプションを追加するには、mpiXX-wrapper-data.txtファイルを変更する必要があります(XXccc++CCf90など)、mpi/share/openmpi/にあります。たとえば、mpiccにオプションを渡すには、/home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txtを変更し、linker_flags=で始まる行に以下を追加する必要があります。

linker_flags= ... -Wl,-rpath,${prefix}/lib

${prefix}は、ラッパーによって現在のOpen MPIインストールパスに自動的に展開されます。

7
Hristo Iliev

私の場合、単に追加するだけです

export LD_LIBRARY_PATH=/PATH_TO_openmpi-version/lib:$LD_LIBRARY_PATH

例えば

export LD_LIBRARY_PATH=/usr/local/openmpi-1.8.1/lib:$LD_LIBRARY_PATH

$HOME/.bashrcファイルに入れてから、再度アクティブにするためにsource $HOME/.bashrcをソースします。

8
rangsiman

Ubuntuで次のコマンドを使用してmpich 3.2をインストールしました。

Sudo apt-get install mpich

mpiexecを使用してmpiプロセスを実行しようとすると、同じエラーが発生しました。

/home/node1/examples/.libs/lt-cpi: error while loading shared libraries: libmpi.so.0: cannot open shared object file: No such file or directory

LD_LIBRARY_PATHを設定しても問題は解決しませんでした。

私のマシンでファイル'libmpi.so.0'を検索しましたが、見つかりませんでした。 'libmpi.so.0'ファイルの名前が私のマシンでは'libmpi.so'であることを理解するのに少し時間がかかりました。そのため、名前を'libmpi.so.0'に変更しました。

それは私の問題を解決しました!

同じ問題が発生していて、apt-getを使用してライブラリをインストールした場合は、次の手順を実行します。

ファイル'libmpi.so'は場所'/ usr/lib /'にある必要があります。ファイルの名前を'libmpi.so.0'に変更します

mv /usr/lib/libmpi.so /usr/lib/libmpi.so.0

その後[〜#〜] mpi [〜#〜]ジョブは問題なく実行されるはずです。

'libmpi.so''/ usr/lib'で見つからない場合、次のコマンドを使用してその場所を取得できます。

whereis libmpi.so
1
Sudheer Raja

単に走る

$ ldconfig

問題を解決するためのより良い方法として私には見えます( this 質問へのコメントから取られました)。特に、LD_LIBRARY_PATH環境変数の誤用を回避するためです。手元の問題を解決するために誤用されていると私が信じる理由については、 ここ および ここ を参照してください。

0
fnnedir

まず、このコマンドを実行します

$ Sudo apt-get install libcr-dev

それでもこの問題が発生する場合は、LD_LIBRARY_PATHを次のように構成します。

export LD_LIBRARY_PATH=/usr/local/mpich-3.2.1/lib:$LD_LIBRARY_PATH

次に、この行の前に〜/ .bashrcに追加します。

[ -z "$PS1" ] && return
0
Hossein