2011-07-28 23 views
13

C++で定義されていない(未定義の動作)コンパイルされたアプリケーションは、1つの共有ライブラリが別の1つの[共有ライブラリ]内で例外を発生させる状況を処理する必要があります。 G ++/Linuxによって生成されたコードは、共有ライブラリ間で例外を発生させることが可能であることを示しています。g ++の共有C++ライブラリ間の例外

私の質問は以下のとおりです。

  1. がポータブル(MSVS)ですか?
  2. 共有ライブラリAは、共有ライブラリBからの例外を処理できません。 [アプリケーションがクラッシュすることを意味します。ライブラリAは、考えられる例外についてはBから知りました。
  3. 私の例での例外処理の動作はリンカに依存しますか?
+0

+1私は長い間同じものをさまよっていました。私はずっと前に「共有図書館の境界を越えた例外はありません」という「神話」を聞いたことがありますが、事実上すべての第三者図書館が例外をスローするので、それは神話だと思います。いくつかの回答を待っています... – davka

答えて

2

これはコンパイラに依存する問題のようです。私はMinGW-GCCを共有DLL(libstdC++でビルドしてクロスDLL例外処理を有効にする必要があります)(Debian版ではデフォルトではなく、GCCを再コンパイルする必要があります) )。

このように、コンパイラ間に共通のABIがないと仮定します。これは、GCCがすべての点でそれ自体に準拠していないためです。技術的な考慮事項に関しては、低レベルの例外処理情報をどこかに格納する必要があり、どこかで例外を処理する第3のライブラリCである可能性があります。コンパイラはこのライブラリを共有できるかもしれませんが、そうではないと思います。

私は現在、POSIXシステムとWindows用のかなり大きなプロジェクトをクロスコンパイルしており、マルチスレッド環境でクロスライブラリ例外を頻繁に使用しています。これはGCC用の共有libstdC++で動作し、すべてのコンポーネントがオープンソースであるため、私はMinGWのすべてのC++依存関係を再コンパイルするだけの贅沢を持っていました。

3

これは本当にあなたの共有ライブラリの使用に依存します。それらを同じアプリケーション/システム内の物理モジュールとして使用し、同じコンパイラでコンパイルする場合は、(C++標準ライブラリに動的にリンクしている限り)OKである必要があります。

しかし、共有ライブラリがあるコンパイラ(同じコンパイラの別のバージョンを含む)でコンパイルされ、別のコンパイラでコンパイルされたモジュールによってアクセスされる可能性がある場合は、標準のバイナリ互換性はありません例外のインタフェース。