6

いくつかの質問:

  1. MinGW は本質的に gcc ソースを取得し、それを Windows 用の実行可能ファイル、つまり gcc.exe にコンパイルしていると理解するのは正しいですか?

  2. MinGW wiki には、「一方、MinGW は Win32 API によって提供される機能を提供します」と書かれています。これは私を混乱させます。Windows のインストールでは、デフォルトで Win32 API を公開する Win32 API ヘッダーが既に提供されているのではないでしょうか? MinGW がそれを再び提供することは冗長になりますか? MinGW が提供するヘッダーは、Windows インストールに付属するものとは異なりますか?

  3. MinGW gcc でコンパイルされたオブジェクト ファイルがある場合、それを Windows の C ランタイム ライブラリにリンクすることはできますか? MinGW gcc によって生成されたオブジェクト ファイルは、Windows の C ランタイム ライブラリと互換性がない (同じ呼び出し規約を使用するなど) 可能性があるため、そうではないと思います。

4

2 に答える 2

2
  1. GCC はマルチプラットフォーム コンパイラであるため、このコンパイラには Linux バージョン、MacOS バージョン、Windows バージョンがあります。「MinGW GCC」は、存在する少なくとも 2 つの Windows バージョンの 1 つです。「MinGW システム」は、いくつかの GNU ツールの Windows 版のコレクションに他なりません。

  2. MinGW Wiki のエントリを読んだだけで、「Win32 API によって提供される」は、「MinGW」と Microsoft C コンパイラの間ではなく、「Cygwin」と「MinGW」の違いを明確にしているようです。

    多くの GNU ツールには、Windows で使用できる 2 つの異なるバージョンがあります。「Cygwin」と「MinGW」です。

    「Cygwin」は、特殊なエミュレーション環境を使用して Unix ライクなファイル システムをエミュレートします。特別なライブラリがプログラムにリンクされ、「fopen」などの関数が「/home/mydir/myfile.txt」形式のファイル名を「c:\programs\cygwin\home\mydir\myfile」などのファイル名に変換します。 TXT"。

    「Cygwin」コンパイラを使用すると、「gcc」コマンドラインと、それによって作成された (より正確にはリンクされた) プログラムのコマンドラインの両方で、Unix のようなファイル名が必要になります。

    ただし、「MinGW」ツールは他の Windows プログラムと同様に動作し、「fopen」などの関数が「c:\somedir\somefile」などの「通常の」Windows に似たファイル名を期待する通常の Windows ライブラリを使用します。「MinGW」GCC コンパイラによってビルドされたプログラムは、Microsoft コンパイラによってビルドされたプログラムのように動作します。

    Linux とは異なり、Windows にはヘッダー ファイルは付属していませんが、Microsoft からダウンロード (> 1GiB) する必要がある Win32 API が付属しています。MinGW と Cygwin は、Microsoft のものとほぼ互換性のある独自のヘッダー ファイルをいくつか提供しているため、Win32 API をダウンロードする必要はありません。

  3. Windows のほとんどの開発ツールは、同じオブジェクトおよび静的ライブラリ ファイル形式を使用します。("Watcom" コンパイラは数少ない例外の 1 つです。) これは、異なるコンパイラでコンパイルされたオブジェクトと静的ライブラリ ファイルを混在させることができることを意味します。(DLL に対する動的リンクに使用される .lib/.a スタブ ライブラリの形式は、gcc と Microsoft の間で異なるため、それらを混在させることはできません!)

他の回答へのコメントについて:

  • MinGW は通常、Windows に付属の「msvcrt.dll」にリンクしています。このファイルには、「printf()」などの標準 C 関数が含まれています。
  • Microsoft Visual C++ は、「msvcrt.dll」にリンクすることもあれば、「msvcr100.dll」などの一部の DLL にリンクすることもあります。「msvcr100.dll」には標準の C 関数も含まれていますが、一部の機能は強化されています (Unicode など)。「msvcr100.dll」は Windows に付属していないため、後からインストールする必要があります。
  • Cygwin は、標準 C 関数の Cygwin バリアント (ファイル名の処理が異なります) を含む「cygwin1.dll」などのファイルにリンクしています。言うまでもなく、このファイルは Windows には付属していませんが、後でインストールする必要があります。

Linux の "libc" とは異なり、これらの DLL はすべてオペレーティング システムを直接呼び出すのではなく、オペレーティング システムを呼び出す低レベル関数 ("WriteFile()" など) を含む "kernel32.dll" を呼び出します。

于 2014-07-10T09:04:09.033 に答える
2
  1. 「gccソース」とはどういう意味ですか? 「gcc ソース」と言うときは、「GCC コンパイラのソース コード」を意味する場合があります。MinGW は GCC の Windows バージョンであるため、任意の C ソース コードを使用して実行可能ファイルを生成します。GCC であるため、そのコンパイラの機能を備えています。

  2. Microsoft が提供するヘッダー ファイル (windows.h や winusb.h など) は、実際には GCC と互換性がないと思います。MinGW プロジェクトには、GCC と互換性のあるヘッダー ファイルが含まれているため、プログラムから Windows 関数などを呼び出すことができますReadFile。前回確認したとき、MinGW には Microsoft ヘッダー ファイルの一部しかありませんでした。winusb.h がありませんでした。

  3. なぜ Windows ランタイム ライブラリとリンクしたいのですか? Microsoft C コンパイラで DLL を作成し、それを MinGW (Qt) プログラムから呼び出したことがあるので、クロス コンパイラの相互運用が可能であることは知っています。

于 2014-07-10T04:22:59.020 に答える