11月
30
その1の続き
そもそも相互運用するとして、どの点に互換性が必要かを考えると、おおむね以下のようになると思います。
- ABI
- 呼び出し規約
- 構造体におけるメンバの配置、特にビットフィールド
- 名前修飾の規則
- 例外の扱い方(C++ の場合)
- オブジェクトファイル (.obj/.o) やスタティックライブラリ (.lib/.a) のフォーマット
呼び出し規約については当然互換性があるはずです。Windows そのものは Visual C++ でビルドしているはずですから、GCC でビルドしたプログラムが Windows を呼ぶことができる(Windows 側からコールバックするケースもある)ということは、少なくとも呼び出し規約については互換性が取れているということです。
構造体については、ぴったり詰め込んでいる場合は大丈夫(Windows API に出てくるような構造体はぴったり詰め込むような定義になっている)でしょうが、パディングがある場合はちょっと心配になります(だいたい大丈夫な気はしますが)。ビットフィールドは言語仕様で処理系定義となっているため、ちゃんと調べるべきでしょう。
その他については完全に処理系依存であるため、どうなってるかは調べないと分かりません。もちろん、ファイルのフォーマットは、スタティックリンクするのではなく DLL にするのであれば無関係です。
というわけでその3以降で調べて行こうと思います。(注:全部調べるわけではない)
Windows 上での Visual C++ と GCC/Clang の相互運用(その3)
その2の続き 細かいことは置いといて、とりあえず一番簡単な条件を試してみましょう。処理系は以下の通り。 Windows 7 64bit Visual Studio 2015 / MS-C for x86 Cygwin 32bit + gcc-core 5.4.0-1 Cygwin 側(Cygwi…