2012-04-04 15 views
9

g ++ - 4.7と-std = C++ 0xを使用してC++ 11でアプリケーションを開発しています。
私のアプリはg ++ - 4.7でコンパイルされたいくつかの共有ライブラリとリンクされていますが、-std = C++ 0xディレクティブはありません。C++ 11とC++ 03のライブラリ互換性

残念ながら、何も動作しません。これは、外部ライブラリのクラスとメソッドを使用するときに私がいくつかの奇妙な動作をすることを意味します。 (もちろん、私のアプリをコンパイルするには、-std = C++ 0xはうまくいきます)。

  1. これは予期される動作か、コンパイラのバグですか?

  2. 回避方法(extern Cキーワードのような)?

+1

ライブラリを '-std = C++ 0x'で再コンパイルできないのはなぜですか? – leftaroundabout

+4

ライブラリヘッダーの1つのビューと異なるビューを持つ別のTUを使用して1つのTUをコンパイルすると、すべての翻訳単位に同じコードが表示されるという要件にはっきりと違反しています。 –

+1

異なるフラグを使用してコンパイルすることは、狂気の最短道の1つです。それは多かれ少なかれ警告や最適化レベルは大丈夫ですが、ソースコードの解釈や生成されるバイナリのレイアウトに影響を与えるときには...ハム。 –

答えて

10

標準ライブラリが変更され、-std=c++0xコンパイラフラグによって、ライブラリのどの部分が使用されているかが決まります。同じプログラムで両方のバージョンを使用しようとすると、One Definition Ruleが破られています(標準ライブラリの使用されている各要素について、同じ識別子に対して2つの定義があります)。

私はこの制限を克服するためにできる簡単なことはないと思います。ライブラリの1つのバージョン(つまり、標準のヘッダーをインクルードする前に適切なマクロを定義してそれらのライブラリ内でC++ 11を無効にする)を使用するだけで、生成されたコードがまだないとは確信できませんODRを破棄します(C++ 11エクステンションがC++ 03ライブラリコードを異なる方法でコンパイルする場合)。

関連する問題