2

gcc 4.7.1 でスタティック ライブラリ (mylib.a) をコンパイルする予定です。C++11 の利点を生かしたいので、-std=c++11 を使用します。この lib をコンパイルするプラットフォームは、glibc-2.8 を使用する x86_64 SLES 11 です。

次に、レガシー プラットフォーム上のこのスタティック ライブラリをレガシー コードにリンクしたいので、レガシー コードのリンクとコンパイルには gcc 4.1.2 を使用する必要があります。したがって、私のライブラリ ヘッダーでは、C++11 固有のコードは使用しません。また、gcc.4.7.1 から libstdc++.a をリンクします。mylib.a、libstdc++.a(gcc4.7.1)、およびレガシー オブジェクト ファイルをリンクするプラットフォームは、glibc-2.4 を使用した x86_64 SLES 10 です。

mylib.a のいくつかのダミー C++11 コード (std::async()) でこの混乱をすべて試してみましたが、うまくいきました。これは、ELF 要件のおかげでのみ可能だと思います。私の考えは正しいですか、それとも ELF は関係ありませんか? mylib.a に非常に複雑なロジックが含まれている場合、どのようなエラーが予想されますか?

4

2 に答える 2

3

Linux には C++ Application Binary Interface (ABI)があり、しばらく前から存在しています。これは、Linux 上のコンパイラ間での呼び出し規則と名前マングリングが修正されたことを意味します。したがって、ライブラリに互換性がある限り、異なるコンパイラ (または同じコンパイラの異なるバージョン) でコンパイルし、正しく確実にリンクするコードを持つことができます。

完全にELF要件自体ではありません...

于 2013-03-11T10:37:36.633 に答える
2

GCCは、3の古いバージョンまでのバイナリ互換性を保証します。リンク先のlibstdc ++に新しいライブラリ機能がある限り、それらを使用できない理由はありません。GCC4.1.2でコンパイルされたコードの新しい言語とライブラリの機能から離れる必要があります。

于 2013-03-11T10:38:35.290 に答える