4

プラグインのような機能を備えた巨大な C++11 プロジェクトがあります。私のプロジェクトには、いくつかのライブラリ (gcc 4.6.3 でコンパイル)、フロントエンド (gcc 4.6.3 でコンパイル)、およびいくつかのプラグイン (gcc 4.7 でコンパイル) があります。プラグインはdlopenライブラリからロードされ、参照されます。

私のプロジェクトでは、テンプレート、typeinfo、shared_ptr、stl コンテナーなどを使用しています。

すべてを同じバージョンの gcc でコンパイルすると、すべて問題なく動作します。私が説明した方法 (4.6.3 のライブラリとフロントエンド、および 4.7 のプラグイン) をコンパイルすると、問題に直面し始めます。

何が起こっているのかわかりません。手がかりを教えて、この問題を回避するのを手伝ってくれることを願っています。

4

2 に答える 2

4

ここで人々が主張していることにもかかわらず、 G++ 4.64.7 と互換性があります。実行時にオブジェクトのビルドに使用される最新バージョンの libstdc++.so を使用する限りです。

しかし、C++11 については、サポートがまだ進化しているため (そして最近まで C++11 もそうでした!)、保証は少なく、C++11 サポートを改善するために互換性のない変更を行うことは避けられませんでした。

より完全な回答については、問題の詳細を gcc-help メーリング リストに投稿してください。調査します。

于 2012-05-29T20:10:48.660 に答える
4

http://gcc.gnu.org/gcc-4.7/changes.htmlから:

GCC バージョン 4.7.0 および 4.7.1 では、C++11 モードの ABI に影響を与える C++ 標準ライブラリへの変更がありました。データ メンバーが std::list に追加され、そのサイズが変更され、一部のメンバー関数の定義が変更されました。 std::pair の move コンストラクターは自明ではなく、std::pair 引数または戻り値の型を持つ関数の呼び出し規約を変更していました。ABI の非互換性は GCC バージョン 4.7.2 で修正されましたが、その結果、GCC 4.7.0 または 4.7.1 でコンパイルされた C++11 コードは、異なる GCC バージョンおよび C++ でコンパイルされた C++11 コードと互換性がない可能性があります。任意のバージョンでコンパイルされた 98/C++03 コード。

std::list<> に問題がありました

于 2012-11-15T08:36:47.447 に答える