6

ターゲット マシン上の glibc のバージョンはほとんど予測できないため、プログラムを静的に glibc にリンクしようとしています。リンカー フラグ -static-libgcc および -static-libstdc++ を使用したところ、問題なく動作しました。実行可能ファイルは大きいですが、私はそれで十分です。残念ながら、ターゲット マシン (以下の例では「mytest」という名前) で実行可能ファイルを実行すると、次のエラーが発生します。

./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_date_time.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_thread.so.1.53.0)

mytestで「strings」を実行すると、

$ strings mytest | grep GLIBC
GLIBC_2.9
GLIBC_2.7
GLIBC_2.8
GLIBC_2.3.2
GLIBC_2.2.5
GLIBCXX_3.4.15
GLIBCXX_3.4.11
GLIBCXX_3.4.14
GLIBCXX_3.4.9
GLIBCXX_3.4

つまり、静的リンクが正常に機能していたと思います。ローダーが共有 glibc および libstdc++ で関数を検索しようとするのはなぜですか? 私は何を間違っていますか?

ありがとう!

4

2 に答える 2

6

ターゲット マシン上の glibc のバージョンはほとんど予測できないため、プログラムを静的に glibc にリンクしようとしています。リンカー フラグ -static-libgcc および -static-libstdc++ を使用したところ、問題なく動作しました。

これは、および とは異なるglibc( libc)のバージョンには影響しませんでした。これらのフラグを使用しても、動的にリンクされた実行可能ファイルが生成されますが、これは古いディストリビューションでは動作しないことが予想されます。libgcclibstdc++

-static実行可能ファイルをフラグでリンクできます。これにより、完全に静的な実行可能ファイルが得られます。

アップデート:

あなたの質問を読み直した後; あなたの問題はありませglibc。あなたの問題はlibboost_log.so、それ自体が に依存している とリンクしていることですlibstdc++.so.6

答えは、libboost*.aの代わりにリンクすることですlibboost*.so。この方法でそれを達成しようとすることができます:

g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \
  -Wl,-Bdynamic

(末尾に があることは非常に-Wl,-Bdynamic重要です。)

于 2013-04-27T06:44:26.907 に答える
1

-static-libgccおよびとのリンクは-static-libstdc++、これらのライブラリに対してのみ機能します。また、libgccおよびlibstdc ++にリンクするboostライブラリ(おそらく動的に)にもリンクしているようです。

以下を実行してみてください。

ldd mytest

「動的実行可能ファイルではありません」と表示されるはずです。それ以外のものが表示される場合は、他のライブラリに対して動的にリンクされていることを意味します。いつもそう簡単にうまくいくとは限りませんが-static、残りのライブラリを処理するために、コンパイル行にも追加してみてください。

于 2013-04-27T00:47:56.230 に答える