2009-05-19 13 views
6

私はいくつかの異種組織にまたがるプロジェクトでredhat 5.2を扱っています。各組織は、さまざまなバージョンのg ++​​でコンパイルされたライブラリを提供しています。現在、これらのバージョンには4.1.1,4.1.2、および4.3.1が含まれています。私はすべてのライブラリを4.1.2を使って実行可能ファイルにリンクしようとしています。これを行うことで何が問題になるのでしょうか?さて、各コンパイラのバージョンがどのABIをビルドするかを知る方法はありますか?異なるC++コンパイラのライブラリを混在させる

+0

最初は、あなたが10歳以上のRed Hat 5.2(Apollo)を意味すると思っていました。 :) – bk1e

答えて

1

実行可能ファイルを静的にリンクする方が簡単かもしれません...大きなバイナリを作成しますが、すべてのプラットフォームで実行します。

6

このABIポリシードキュメントは、異なるABIバージョン間の互換性を詳述しています。 それによると、libstdc++.soライブラリは互換性があり、gccがバイナリ互換性を破った最後の時刻は3.4でした。あなたは大丈夫です。

0

g ++のさまざまなバージョンから構築されたライブラリをリンクする際に、g ++のWebサイトにリストされていない限り問題はありません。しかし重要なのは、これらのライブラリは、あなたのケースではredhat 5.2と同じプラットフォーム上に構築されるということです。 linux/redhat(solarisと言う)以外のプラットフォーム用に構築されたライブラリはあなたのexeとリンクしません。

0

IIRCでは、これを行うために使用されるC++互換ライブラリがあります。私はそれがlibstdC++ - compatと呼ばれると思う。

+0

異なるバージョンのstdlibC++に依存するオブジェクトをリンクすることはできません。 – ephemient

5

GCC(GNU Compiler Collection)では、バージョン番号と互換性が定義されています。

4.1.1と4.1.2の間のG ++ライブラリは互換性があります。最新のものとリンクしてください。

4.1.xと4.2.xの間のG ++ライブラリは互換性がありません。何かを再コンパイルする必要があります。

3.x.yと4.p.qの間のG ++ライブラリは互換性がありません。何かを再コンパイルする必要があります。

ご使用のシナリオでは、4.3.1で構築されたコードは他のコードと互換性がありません。

4.3.xで現在コンパイルされているコードを再構築して4.1.xを使用するか、4.1.xでコンパイルされたコードを再コンパイルして4.3.xを使用する必要があります。

+0

それは理論ですが、実際には最後のABIの変更は3.4 –

+0

です@エド:しかし、将来はいつでも、そのルールを呼び起こす変更があり、物事にうんざりしている人が驚き(再コンパイルする必要があります)。 –

関連する問題