6

最近の GCC (4.3.3) を使用している C++ コードベースを持っていますが、GCC 3.2.3 を使用して構築された古いライブラリにリンクする必要があります。利用可能なライブラリの新しいバージョンはありません。それなしでは行きません。また、クローズド ソースであるため、再構築することはできません。

GCC 4.3.3 と 3.2.3 の間には ABI の非互換性があるため、これは問題を引き起こしているようです。そのため、これを解決するためのオプションを確認しようとしています。

いくつかの追加の詳細:

  • -fabi-version=1 を使用してコードベースのすべてを再構築し、正しい ABI バージョンを取得できますが、libstdc++ バージョン 6 のいくつかの新しい機能に依存しています。
  • コードベース以外のすべての C++ ライブラリの依存関係はオープン ソースであるため、この 1 つのライブラリを除いて、必要に応じて再構築できます。
  • 再構築できない、または再構築が困難な多くの C ライブラリ依存関係。
  • 古いライブラリは libstdc++ バージョン 5 の一部の機能に依存しているようです

私はこれまでに試しました:

  • -fabi-version=1 を使用してすべての C++ コードと依存ライブラリを再構築し、libstdc++ バージョン 6 に対してリンクします。これは、C++ 標準ライブラリ シンボルの少数の未定義シンボル エラーで失敗します。
  • 上記と同じですが、さらに libstdc++ 5 の共有ライブラリにリンクします。これによりリンカーの問題は解決されますが、レガシー ライブラリ内で実行時に 2 つのバージョンが混在するように見え、クラッシュが発生します。

このページを読みました: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.htmlこれは、ライブラリ間のさまざまな依存関係を満たすために、アプリケーションで C++ ABI バージョンを混在させることが可能であることを示しているようです。ただし、何かが欠けていない限り、ここではうまく機能していないようです。

何か案は?

4

1 に答える 1

4

わかりました、あなたの回避策は次のとおりです:

  • 古いC++ライブラリへの「C」インターフェースを書き、3.2.3でコンパイルして動作するようにします。
  • これで、新しいコンパイラで C インターフェイスを使用できるようになりました。

C ライブラリの周囲に C++ の「ラッパー」コードを記述して、C++ として使用できますが、このコードは新しいコンパイラでビルドされます。

于 2012-02-06T15:32:11.007 に答える