6

g++ABI の変更による標準 C++ ライブラリへの重大な変更を行わずに、C++11 の新しい言語機能を有効にする方法はありますか?

-std=c++11コンパイル フラグを追加すると、言語とライブラリの両方の機能を有効にするように指示されますが、この方法で作成されたオブジェクト ファイルは、別の設定g++を使用したオブジェクト ファイルと安全にリンクできません。-std=右辺値参照、ムーブ コンストラクター (自分のクラス用)、およびautoC++03 ライブラリにリンクされたコード内のキーワードなどの言語拡張機能を使用できるようにしたいと考えています。

編集:

g++その C++11言語機能を有効にすることに興味がありますが、古い C++03 ライブラリに対して解析、コンパイル、およびリンクしたいと考えています。標準ライブラリの C++11 バージョンを使用したくありません。つまり、私自身のコードではauto、range foreach コンストラクト、右辺値参照などを使用できますが、標準 C++ ライブラリの新しい C++11 機能 (または右辺値など) を使用することはできませんstd::move。 -ref STL コンテナーの機能強化。標準ライブラリの C++11 バージョンが不要な理由は、さまざまなオブジェクトのレイアウトが変更されたためです。そのため、標準ライブラリの異なるバージョンを期待する 2 つのオブジェクト ファイルを同じバイナリにリンクすることは無効です。

4

2 に答える 2

2

いいえ、C++11 ライブラリ機能なしで C++11 言語機能を有効にすることはできません (libstdc++ ヘッダーを編集してすべての C++11 パーツを削除しない限り、有効にすることはできません)。

しかし、互換性のないシンボルは多くありません (4.7.2 で元に戻された、互換性のない 4.7.0 または 4.7.1 を使用しない限り) ため、おそらくRB ツリーのメンバーstd::listについてのみ心配する必要があります。erase()コンテナ。シンボルの C++11 バージョンがメインの実行可能ファイルで定義されていることを確認して、そのバージョンのシンボルがそれを必要とするすべてのコードで使用されるようにすることができます。C++03 バージョンを想定している他のライブラリのコードは戻り値を無視し、C++11 バージョンを想定しているコードは戻り値を使用できます。

于 2013-03-13T00:21:31.580 に答える
0

私の知る限り、GCC4.7以降にはABIの変更があります。その下のバージョンを試すことができます。

-std=gnu++11の代わりに使用することも役立つ場合があります-std=c++11。なぜそれが正確なのかはわかりませんが、うまくいきました。

于 2013-03-12T13:56:55.777 に答える