Windows環境のCコンパイラ(MSVCおよびGCC/MinGW)の特定のケースでは、バイナリ互換性を前提としています。 Visual StudioでGCCでコンパイルされたCインターフェイスDLLをプログラムにリンクすることができます。これは、ffmpegのようなC99プロジェクトが、開発者がVisual Studioを使ってアプリケーションを書くことを可能にする方法です。 DLLからMicrosoftツールチェーンにあるlib.exeでインポートライブラリを作成するだけで済みます。逆に、mingw.orgのpexports以上のmingw-w64のgendefツールを使用すると、MSVCで生成されたDLL用のGCCインポートライブラリを作成できます。
この便利な相互運用性は、MSVCとGCCのABIが異なり、互換性がないC++インターフェイスワールドに入ると分解されます。それはうまくいくかもしれないし、そうでないかもしれないし、保証がなされておらず、それを変更しようと努力していない(現在)。また、誰かがMSVCのデバッガと互換性のあるGCCにデバッグ情報ジェネレータ/ライタを書き込むまで(もちろんgdbサポートとともに)、デバッグ情報は明らかに異なります。
私はC99が関数宣言や引数がシンボル定義で扱われる方法を特に変更するとは思わないので、ここでも問題はありません。
Vijay氏によれば、アーキテクチャの違いがあるため、AMD64ライブラリにリンクするときにx86ライブラリを使用することはできません。
また、クローズドソースのバイナリについてのあなたの追加質問に答えると、使用可能なすべてのコンパイラ/アーキテクチャのバージョンを配布するには。
これは、クローズドソースバイナリを作成するのとまったく同じです。インポートライブラリに加えて、DLLからのエクスポートを非表示にしてDLL自体をリンクに使用しないようにすることも非常に重要です(クライアントコードでライブラリ内のプライベート関数を使用したくない場合は、例えばdumpbin /exports
MSOffice DLLには、たくさんの隠されたものがあります)。あなたは__attribute(hidden)
などのものを使ってGCCで同じことを達成することができます。
いくつかのコンパイラの特定のポイント:
MSVCは/ MT、/ MDを通じて4(新しいバージョンで、残りも、実際にはわずか3)異なるランタイムライブラリが付属しており、/ LD。さらに、互換性を保証するために、Visual Studioの各バージョン(Service Packを含む)のビルドを提供する必要があります。しかし、それはあなたのためのクローズドソースバイナリとWindowsです...
GCCにはこの問題はありません。 MinGWは、Windows(Windows 98以降)から提供されるmsvcrt.dllにリンクします。これは/ MDと同等です(そして/ MDdと同等のデバッグライブラリでもあります)。しかし、バイナリ互換性を保証しないMinGW(mingw.orgとmingw-w64)の2つのバージョンがあります。後者は、64ビットオプションと32ビットを提供し、より完全なヘッダ/ライブラリセット(DirectXとDDKのかなりの部分を含む)を提供するので、より完全です。
非常に興味深い質問です。奇妙なことに、私がUN * Xの世界で80年代初頭と中頃にデバッガガイに戻ってきたにもかかわらず、これは深刻な考えを実際に与えたことはありませんでした。もちろん、私は主にシンボルテーブルをガイドとして使用していましたが、構造体のビットパッキングとスタック上のargsのプッシュについての質問が残っています。私はその世界では、ほとんどのコードが製造元のコンパイラまたはGCCのいずれかのバージョンまたは別のバージョンでコンパイルされていると推測しているので、固有の整合性がありましたが、それはあなたが求めているものではありません。 –