6

Linuxで共有ライブラリをコンパイルするためにg ++ 4.4を使用しています。ライブラリで使用できる場合は、いくつかの C++11 機能を使用したいと考えていますが、コンパイラのバージョンを更新したり、ライブラリのユーザーに特別なコンパイラ スイッチを要求したりすることはできません。

2 つの質問がありますが、決定的な答えを見つけるのに苦労しています。

  1. -std=c++0x または -std=g++0x を使用して共有ライブラリをコンパイルする場合、ライブラリを使用するプログラムがこれらのスイッチを必要としないことが保証されますか (ただし、c++0x 機能がない場合)。ヘッダファイル)? うまくいくように見えますが、将来の微妙な問題にサインアップしたくありません。

  2. g++ 4.4 の C++11 の標準ライブラリは完全ではありません。標準ライブラリの多くはヘッダーのみであり、gnu のヘッダー ファイルは一般にバージョンの ifdef でいっぱいであるため、少なくとも libstdc++ のヘッダー ファイルの最新バージョンを使用する方法があると思います。ただし、別の .so を使用することはできません。私はこれを一緒にこすることができると確信していますが、このようなことを正しく行うことは可能ですか?

ありがとう。

4

2 に答える 2

5

1. 共有ライブラリを -std=c++0x または -std=g++0x でコンパイルした場合、ライブラリを使用するプログラムがこれらのスイッチを必要としないことが保証されますか (c++0x がない場合)ヘッダファイルの機能)?うまくいくように見えますが、将来の微妙な問題にサインアップしたくありません。

C++11 のサポートは、GCC 4.x リリースではまだ実験的でした (GCC 5 以降では実験的ではなくなりました)。動作を維持するように努めましたが、答えはノーです。通常、すべての場合に動作することは保証されていません。-std=c++0xC++03 コードと C++11 コードが混在するプログラムで問題を引き起こす可能性がある、使用によって引き起こされる ABI の変更が多数あります。詳細については、http: //gcc.gnu.org/wiki/Cxx11AbiCompatibilityを参照してください。ライブラリがそのページに記載されているシンボルをエクスポートしていない場合は、問題ありません。

2. g++ 4.4 の C++11 の標準ライブラリは完全ではありません。標準ライブラリの多くはヘッダーのみであり、gnu のヘッダー ファイルは一般にバージョンの ifdef でいっぱいであるため、少なくとも libstdc++ のヘッダー ファイルのより新しいバージョンを使用する方法があると思います。ただし、別の .so を使用することはできません。私はこれを一緒にこすることができると確信していますが、このようなことを正しく行うことは可能ですか?

いいえ、それがうまくいく可能性はまったくありません。それ以降のバージョンのヘッダーは、4.4 でサポートされていない機能を使用しており、それらを使用できたとしても、新しい を使用する必要がありますlibstdc++.so。いいえ。

ヘッダーはversion でいっぱいではありません。ほとんどの場合、使用時に G++ によって定義されて#ifdefsいるチェックのみが見つかりますが、4.4 バージョンがラムダ、非静的データ メンバー初期化子、適切な右辺値参照セマンティクスをサポートしているわけではありません。 、デフォルト/削除された関数など、後のヘッダーで自由に使用できます。付属の GCC と同じバージョンの libstdc++ ヘッダーを使用する必要があります。__GXX_EXPERIMENTAL_CXX0X__-std=c++0x

つまり、適切な C++11 サポートが必要な場合は、新しいコンパイラを使用する必要があります。

新しいコンパイラを使用できない場合、適切な C++11 サポートを取得できません。

于 2012-11-14T19:26:15.193 に答える
3

私はこれを試しません。クラスまたは関数の定義を変更するために必要なのは、ヘッダー内の C++11 定義のマクロ 1 つだけであり、エンド ユーザーは 1 つの定義のルールに違反することになります。これらの使用は、私が想像する非常に微妙なものになる可能性があります。

同様にvector(count, item = T())、C++11 には存在しなくなったコンストラクターがあります (現在は 2 つのコンストラクターです)。

要するに、1 つの定義ルールに違反しないように、ライブラリで使用する標準ライブラリ コンポーネントについて本当に注意する必要があります。これらの機能を使用する価値がある破損のリスクがあるとは思えません。

あなたができることは、新しいコンパイラを使用できるようになるまで、および/またはエンドユーザーに C++11 サポートを使用してコンパイルすることを要求できるようになるまで、言語のギャップを埋めるためにboostandを使用することです。tr1

于 2012-11-14T16:56:19.467 に答える