0

Linux GCC 2.95.2 で構築された古い静的ライブラリを再利用しようとしています。32 ビット Ubuntu ディストリビューションの最新のコンパイラ (GCC 4.6) を使用しています。ライブラリは C++ で書かれています。クラスにカプセル化された関数とのリンクに問題があります。

シンボルのネーミングが変わったと思います。

http://www.qnx.com/developers/docs/6.3.2/momentics/compatibility/about.html#C++_code : GCC 2.95.3 (6.2.1 または 6.3 から) と GCC 3.3.5 では異なるC++ ABI とは異なる名前マングリングを持っています。その結果、GCC 2.95.3 でビルドされた C++ バイナリ (オブジェクト、実行可能ファイル、ライブラリ) を GCC 3.3.5 でビルドされたバイナリとリンクすることはできません。

ld のエラー出力は次のとおりです。

`foo1::Bar()' への未定義の参照 (クラス foo1; メンバー Bar)

ツール mn を使用すると、シンボルを読み取ることができます。一致するシンボルは別の方法で命名されます。

Bar__4Foo1

質問: ライブラリ ファイル内のシンボルの名前を変更する方法はありますか? または、古い命名形式を受け入れるように ld を強制できますか?

4

1 に答える 1

0

シンボルのネーミングが変わったと思います。

正しい。

あなたが見逃しているのは、命名が何らかの理由で変更されたことです。つまり、g++ 2.95 および g++ 3.3 によって生成されたコードは ABI非互換です。これらのコンパイラでコンパイルされた 2 つのオブジェクトを一緒にリンクすることを許可された場合、原因不明のクラッシュが発生するだけです。

名前マングリングを変更することで、GCC 開発者はこのようなクラッシュをデバッグする手間を省きました。

ライブラリ ファイル内のシンボルの名前を変更する方法はありますか?

ありますが、それで成功するとクラッシュするので、足を撃ち落とさないでください。

于 2013-08-10T03:30:30.407 に答える