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
Solarisランタイムリンカー検索パスを設定する最も簡単な方法は、crle
を使用することですが、システムを壊すとシステムが非常に簡単に使用できなくなる可能性があるため、設定には十分注意する必要があります。たす /usr/local/bin
リンカーパスへ:
# crle -u -l /usr/local/lib
それが完了したら、crle
を単独で呼び出して、新しい検索パスを確認します。
別の方法は、パスをバイナリ自体にコンパイルすることです。
$ gcc -Wl,-rpath,/usr/local/lib -o test test.o -lstdc++
バイナリはリンカーパスを調整しなくても他のシステムで機能するため、上記はより適切なオプションです。
問題は、Solarisローダーがライブラリを見つけられないことです。
最善の方法は、コンパイル中にLD_RUN_PATH
環境変数をlibstdc ++。so.xxxx(バージョン番号)が存在するディレクトリに設定することです。 。これは、実行時にそのディレクトリを検索するようにリンカに指示します。
LD_RUN_PATH
をLD_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>
まず、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