2010-11-27 15 views
5

私はmingwとlinuxのクロスコンパイルを使ってWin32用のプラグインを開発しています。私のプラグインはアプリケーションによって正常に読み込まれていて、アプリからもcom-interfaceを持っていましたが、そこから関数を呼び出すことはできません - アプリケーションがクラッシュします。これは、mingwのインターフェイス実装のvtableのアライメントが間違っているためです(これはMSVSと完全に機能していました)。仮想関数の配置方法は?

ありがとうございます、ありがとうございます。

答えて

4

VTableアラインメント(実際、VTableシステム全体は完全に実装に依存します)。リンケージ後に実行可能なプログラムを使用するには、同じスイッチ/設定でコンパイルされた同じコンパイラを使用する必要があります。

この理由から、msvcで生成されたバイナリをMinGWで生成されたバイナリにリンクすることはできません。たとえテーブルを整列させても、名前のマングリングアルゴリズムは異なります。誰も、2つのコンパイラがvtable内の個々の関数に対して同じ順序を選択するとは誰も言いません。

2つのコンパイラの間にポータブルインターフェイスが必要な場合は、標準化されたABIを持つC(技術的にはextern "C")インターフェイスで行う必要があります。

+1

COMもABIですが、MinGWがこれほど簡単にサポートしていないものもあります。 COMはWin32の主要な部分であるため、MinGWが非常に難しくなっていることに驚いています(COMは、(あまり真実ではありません))仮定に基づいています。しかし、他のC++コンパイラではCOMをうまくサポートしていますので、Cや同じコンパイラを使う必要はありません; Windowsの場合はまともなC++コンパイラです)もちろん、COMをまっすぐなCでもIDLコンパイラは一般的にCインタフェースも定義しています)。 –