4

簡単な質問-g++リンカーを特定のlibstdc++ライブラリバージョンとリンクさせる方法はありますか?gcc/のmanページにg++も、ここにある他の質問にも、役立つものは何も見つかりませんでした。

これが状況です-私のアプリケーションは、で構築された特定の共有ライブラリをlibstdc++.so.5使用しており、にインストールして使用したいと考えていRHEL5ます。そのため、マシン上でアプリケーションをビルドしようとすると、RHEL5次の警告が表示されます。

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6

compat-libstdc++rpmをインストールしても効果はありませんでした。機能がないstd::stringため、のデストラクタでプログラムがクラッシュします。だから、このRHEL5マシンで私はこれを持っています:

[root@xxx]# ll /usr/lib/libstd*  
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7  
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7  

そして私が作るとき

[root@xxxx]# ldd my_exe  
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)  
...  
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)

私はそれが未定義の振る舞いであることを知っているので、これは悪いことです:/

それで、のみを使用して実行可能ファイルをビルドする方法はありますlibstdc++.so.5か?libstdc++.so.6(多くの理由により、削除はオプションではありません。静的リンクもオプションではありません)。

どうもありがとう!

4

1 に答える 1

5

これがABIバージョンの表です。スイッチのデフォルト値が-fabi-version1から2に変更されると同時に、g++は3.4でlibstdc++。so.6を導入しました。これは、古いlibstdc ++ライブラリに対してリンクするには、次のことを行う必要があることを意味します。

  • コンパイラに含まれているものの代わりに、同等のC++ヘッダーを見つけて使用します
  • すべてのコード(および使用している他のC ++ライブラリ)をで再コンパイルします-fabi-version=1

そうしないと、ABIの非互換性のリスクがあります。変更点を正確に伝えることはできませんが、一般的には、コンパイルしたすべてのC++コードを同じコンパイラバージョンで保持することをお勧めします。

このように一緒に物事をハックしたくないと仮定すると、2つの選択肢があると思います。

  1. 共有ライブラリベンダーに、ご使用のバージョンのGCCでライブラリを再コンパイルするよう依頼してください。g ++3.4が新しいより厳密なC++パーサーを導入したため、これは簡単ではないかもしれません。
  2. ベンダーに、最初にライブラリをコンパイルするために使用したg ++のバージョンを尋ね、そのバージョンを使用して独自のコードをコンパイルします。RHはcompat-gccコンパイラとlibstdc++を提供するかもしれません-私は思い出せません。ただし、使用している他のすべてのライブラリとOS提供のC ++ライブラリのダウンレベルバージョンも必要になるため、適切なコンパイラを備えた古いバージョンのRedHatを使用してVMでコンパイルするのが最も簡単な場合があります。
于 2010-08-31T10:29:45.097 に答える