この質問が以前に尋ねられたことは知っていますが、マイナスを与えて繰り返しの質問を報告する前に、これについてしばらく考えてください。
以前のすべての回答で、オブジェクトのメモリ レイアウトはコンパイラに依存すると誰もが言いました。では、共有ライブラリ (*.dll、*.so) が c++ クラスをエクスポートおよびインポートでき、異なるコンパイラからのものであってもそれらを確実に組み合わせることができるのはなぜでしょうか? mingw で書かれた DirectX アプリケーションを考えてみましょう。DirectX は MSVC++ を使用してコンパイルされたので、それらの環境はどのようにメモリ レイアウトに同意するのでしょうか? DirectX が C++ クラスとポリモーフィズムに大きく依存していることは知っています。
別の質問: 選択したアーキテクチャ (Windows、Intel x86 など) があり、新しいコンパイラを作成しようとしているとしましょう。別のコンパイラによってコンパイルされた .dll lib によって提供されるクラス インスタンス (vtable、メンバー フィールド) にアクセスする方法を知るにはどうすればよいですか? それとも単にそのようなものですか: M$ は VC++ を記述しましたが、それ以来、それは書かれていない標準であり、他のすべてのコンパイラは「互換性の理由から」同じことを行いますか? Linux やその他の OS についてはどうでしょうか。
編集:
わかりました、DirectX の例は COM の仕様のために悪いものでした...
別の例: QT。私は mingw で QT を使用していますが、MSVC バージョンも利用できることを知っています。違いがヘッダーのみなのか、共有ライブラリ (dll-s) も異なるのかはわかりません。もしそうなら、qt ライブラリを含めてアプリを配布しなければならないということですか? (それなら、メモリとコードを共有するのはいいことですよね?)。それとも、それらは同じであり、とにかくそれについて不文律があるのでしょうか?
EDIT2:
共有されているものと共有されていないものを確認するためだけに、別のqtバージョン(msvc 2010)をインストールしました。共有されている (実際に共有されている) ライブラリは異なるようです。その場合、本当にqt-libsをアプリに提供する必要があるようです...そして、これは小さなことではありません(例:QtGui 8-9MB)。作成者が他のコンパイラ用のバージョンを提供するのにそれほど親切ではなかった、他の小さなライブラリはどうですか? 元のコンパイラに固執しているということですか? 異なるコンパイラでコンパイルされた 2 つの異なるライブラリを使用したい場合はどうすればよいですか?