20

私は Linux の世界から来て、C++ 言語で記述された動的ライブラリ API の後方バイナリ互換性 (BC) の維持に関する記事をたくさん知っています。そのうちの 1 つは、GCC コンパイラで使用されるItanium C++ ABIに基づく「Policies/Binary Compatibility Issues With C++」です。しかし、Microsoft C++ コンパイラ (MSVC から) に似たものは見つかりません。

ほとんどの手法が MS C++ コンパイラに適用できることを理解しており、ABI の違い (v テーブル レイアウト、マングリングなど) に関連するコンパイラ固有の問題を発見したいと考えています。

だから、私の質問は次のとおりです。

  • BC を保守する際の MS C++ コンパイラと GCC コンパイラの違いを知っていますか?
  • MS C++ ABI に関する情報、または Windows で API の BC を維持するための情報はどこにありますか?

関連する情報は高く評価されます。
助けてくれてどうもありがとう!

4

3 に答える 3

24

まず第一に、これらのポリシーは一般的なものであり、gcc のみを指すものではありません。例: 関数のプライベート/パブリック マークは、gcc ではなく MSVC に固有のものです。

したがって、基本的にこれらのルールは、MSVC および一般的なコンパイラにも完全に適用されます。

しかし...

次のことを覚えておく必要があります。

  1. GCC/C++ は 3.4 リリース以降 ABI の安定性を維持しており、MSVC がメジャー リリースごとに ABI を壊している間 (2004 年から) 約 7 年間、MSVC8 (2005)、MSVC9 (2008)、MSVC10 (2010) は互いに互換性がありません。
  2. MSVC で頻繁に使用されるフラグの中には、ABI を壊すものもあります (例外モデルなど)。
  3. MSVC には、デバッグ モードとリリース モードのランタイムに互換性がありません。

はい、これらのルールを使用できますが、通常の MSVC の場合と同様に、さらに多くの癖があります。

「バイナリ互換性に関するいくつかの考え」も参照してください。Qt は、MSVC でも ABI の安定性を維持します。

CppCMSでこれらのルールに従っているため、これについてはある程度の経験があります

于 2011-01-24T14:05:12.157 に答える
9

Windows では、長期的なバイナリ互換性のために基本的に 2 つのオプションがあります。

  1. COM
  2. COMの模倣

ここで私の投稿をチェックしてください。DLL を作成し、さまざまなコンパイラやコンパイラのバージョン間でバイナリ互換性のある方法で DLL にアクセスする方法がわかります。

C++ DLL プラグイン インターフェイス

于 2011-01-28T11:02:09.730 に答える
8

MSVC バイナリ互換性のための最善のルールは、C インターフェイスを使用することです。私の経験では、C++ の唯一の機能は、単一継承インターフェイスです。したがって、すべてを C データ型を使用するインターフェイスとして表します。

バイナリ互換でないもののリストを次に示します。

  • STL. バイナリ形式は、デバッグ/リリースの間でもコンパイラ フラグに応じて変化するため、STL クロスモジュールを使用しないことをお勧めします。
  • 山積み。あるモジュールと別のモジュールではnew/しないでください。お互いを知らない異なるヒープがあります。STL がモジュール間で機能しないもう 1 つの理由。mallocdeletefree
  • 例外。あるモジュールから別のモジュールに例外が伝播しないようにします。
  • 他のモジュールからの RTTI/dynamic_casting データ型。
  • 他の C++ 機能は信用しないでください。

要するに、C++ には一貫した ABI がありませんが、C にはあります。そのため、C++ の機能がモジュールをまたぐことは避けてください。単一継承は単純な v テーブルであるため、C データ型を使用し、クロスヒープ割り当てを行わない場合は、C++ オブジェクトを公開するのに便利に使用できます。これは、Microsoft 自身が Direct3D API などで使用しているアプローチでもあります。GCC は安定した ABI を提供するのに役立つ場合がありますが、標準ではこれを要求しておらず、MSVC はこの柔軟性を利用しています。

于 2011-01-28T21:56:36.230 に答える