7

g++を使用してコンピューターでc++プログラムをコンパイルし、実行可能ファイルを転送して大学のサーバーで実行すると、次のようになります。

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main)

プログラムは私のコンピューターで正常に実行され、大学のサーバーに新しいソフトウェアをインストールする権限がありません。

何か助けはありますか?ありがとう

4

4 に答える 4

8

自宅でプログラムをリンクするときに、標準ライブラリを共有ライブラリ(デフォルトの動作)として使用しているようです。

したがって、リンカはライブラリを実際に「リンク」するのではなく、ライブラリの実際のロードを実行時に遅らせながら、いくつかのシンボルを解決して別の操作を実行します。

大学のコンピューターでプログラムを実行すると、ローダー(実際にプログラムをメモリにロードしてメインスレッドをスローするプログラム)が、プログラムに必要なライブラリを探してロードしようとします(LD_LIBRARY_PATH興味がある場合はLinuxで探してください)。 。

ここでの問題は、自宅のプログラムを、大学で持っているものと同じバージョンではないstdlibのバージョンにリンクしていることです。したがって、ローダーがライブラリを見つけようとすると失敗し、プログラムを実行できなくなります。

ソリューション:

a)これらすべての問題を回避するには、動的リンクではなく静的リンクを使用します。これがstdlibで可能かどうかはわかりませんが、テストする価値があると思います(http://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlを参照して、「-static」フラグを探してください)。 )。

b)大学のコンピュータでプログラムをコンパイルして、そこでのバージョンを使用するようにすることができます。

c)そこにインストールされているstdlibのバージョンを確認し、同じバージョンをコンパイラマシンにインストールしてみてください。

d)ホームバージョンのstdlibをアプリケーションと同じフォルダーにコピーしてみてください。これは通常、ローダーが環境変数LD_LIBRARY_PATH(linux)で設定されたパスを調べる前に、現在のアプリケーションフォルダーで共有ライブラリを検索する傾向があるために機能します。

お役に立てば幸いです。

PS:ここでは、静的ライブラリと共有/動的ライブラリの優れた紹介がありますhttp://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

そして、ここ(http://en.wikipedia.org/wiki/Library_%28computing%29)は、それほど素晴らしいものではありませんが、より完全なライブラリの説明です。

于 2011-08-22T16:37:49.090 に答える
4

libstdc++.so.6大学のコンピュータでは、のバージョンが古すぎます。2つのオプションがあります。

  1. と静的にリンクし-staticます。その後、C++ライブラリは最終的なバイナリにマージされます。
  2. 正しいバージョンをホームディレクトリのどこかにコピーしてから、-rpath /path/to/library/directoryビルド時に渡すかLD_LIBRARY_PATH、新しいを含むディレクトリを指すように環境変数を設定して、それを参照しますlibstdc++.so.6
于 2011-08-22T16:23:22.723 に答える
4

のバージョンを/usr/lib/libstdc++.so.6サーバーのホームディレクトリのサブディレクトリにコピーして、次の~/libように実行できます。

$ LD_LIBRARY_PATH=$HOME/lib ./main

またはあなたが好むなら

$ export LD_LIBRARY_PATH=$HOME/lib
$ ./main

また、プログラムはシステムライブラリではなくプライベートライブラリをロードする必要があります。

于 2011-08-22T17:01:24.327 に答える
1

どのプラットフォーム用にコンパイルしようとしていますか?すなわち、「あなたのコンピュータ」とあなたの「大学のサーバー」?

静的リンクオプションを使用してプログラムをコンパイルしてみてください。これにより、静的にリンクされた実行可能ファイルが生成され、すべてのlib依存関係がすでにロードされています。

乾杯、

于 2011-08-22T16:23:36.147 に答える