web-dev-qa-db-ja.com

libstdc ++。so.6:開くことができませんでした:そのようなファイルまたはディレクトリはありません

Solarisで最初のC++プログラムを実行しようとしています。単純なHelloWorldプログラム。走ろうとすると。エラーが発生しますlibstdc++.so.6:open failed:No such file or directory。もちろん、グーグルをして、環境変数を設定することでこれを解決できることがわかりました。

export LD_LIBRARY_PATH=/usr/local/lib

再ログインした後、私はそれがそれを解決するための恒久的な方法ではないことに気づきました。これは、コンパイル中にlibstdc ++。so.6をリンクすることと関係があると思います。これが私が最初からしたステップです:

bash-3.2# gcc -c test.cpp

bash-3.2# gcc -o test test.o -lstdc++

bash-3.2# ./test
   libstdc++.so.6:open failed:No such file or directory

bash-3.2# ldd test | grep not
   libstdc++.so.6 =>        (file not found)

bash-3.2# /usr/ccs/bin/elfdump test | grep RUNPA

bash-3.2# find /usr -name libstdc++.so.6
   /usr/local/lib/libstdc++.so.6

コンパイル中にフラグなどを見逃しましたか?そのプログラムを実行するときにどこを探すべきかがわかるように、ソフトリンクを作成するにはどうすればよいですか?

これは私が使用しているプラ​​ットフォームです:

bash-3.2# uname -a
   SunOS ms-sparc8 5.8 Generic_108528-13 Sun4u sparc SUNW,Sun-Blade-100

bash-3.2# gcc -v
   Reading specs from /usr/local/lib/gcc-lib/sparc-Sun-solaris2.8/3.3.2/specs
   Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls --disable-libgcj --enable-languages=c,c++
   Thread model: posix
   gcc version 3.3.2
2
Mohd Fikrie

Solarisランタイムリンカー検索パスを設定する最も簡単な方法は、crleを使用することですが、システムを壊すとシステムが非常に簡単に使用できなくなる可能性があるため、設定には十分注意する必要があります。たす /usr/local/binリンカーパスへ:

# crle -u -l /usr/local/lib

それが完了したら、crleを単独で呼び出して、新しい検索パスを確認します。

別の方法は、パスをバイナリ自体にコンパイルすることです。

$ gcc -Wl,-rpath,/usr/local/lib -o test test.o -lstdc++

バイナリはリンカーパスを調整しなくても他のシステムで機能するため、上記はより適切なオプションです。

2
mjturner

問題は、Solarisローダーがライブラリを見つけられないことです。

最善の方法は、コンパイル中にLD_RUN_PATH環境変数をlibstdc ++。so.xxxx(バージョン番号)が存在するディレクトリに設定することです。 。これは、実行時にそのディレクトリを検索するようにリンカに指示します。

LD_RUN_PATHLD_LIBRARY_PATHと混同しないように注意してください。後者は実行時に解析されますが、LD_RUN_PATHは基本的にライブラリパスで実行可能ファイルにコンパイルされるため、ライブラリを見つけるためにLD_LIBRARY_PATH設定は必要ありません。

他のすべてが失敗した場合は、LD_LIBRARY_PATH環境変数を適切に設定するラッパーシェルスクリプトからいつでもプログラムを実行できます。

それは要点です、

  • /usr/local/libに含まれていない場合は、LD_LIBRARY_PATHを設定します。

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ; export LD_LIBRARY_PATH

  • gccファイルは通常/usr/lib/gcc/にインストールされます。

次に、ソフトリンクを使用して、インストールされたディレクトリから/usr/libまたは/usr/local/libにlibstdc ++。so.6をリンクします。

Sudo ln -s libstdc++.so.6 /usr/lib/<filename>
1
delta24

まず、crleを使用する必要はありません(そして、自分が何をしているかを本当に理解していない限り、それを避けてください。私を信じてください。間違って使用すると、クレイジーなランタイムエラーでロックアウトされます)

次に、LD_LIBRARY_PATHを設定する必要はありません(ほとんどの場合)。また、/ usr内のサードパーティライブラリをシンボリックリンクする必要もありません。

Mjturnerが提案することを実行し、コンパイル時にgccに正しいランタイムパスを与えるだけです。

PS:C++コードはg ++でコンパイルする必要があります

リンク:

http://notes.theorbis.net/2010/01/how-to-screw-up-solaris-with-crle.htmlhttp://prefetch.net/articles/リンカー.badldlibrary.html

0
Solarized