私は C++ 開発者ではありませんが、常にコンパイラに興味があり、GCC の一部 (特に LLVM) をいじることに興味があります。
Windows では、GCC を正しく実行するには POSIX エミュレーション レイヤー (cygwin または MinGW) が必要です。
何故ですか?
私は、C++ で記述され、さまざまなプラットフォーム (Subversion、Firefox、Apache、MySQL) 用にクロスコンパイルされた他の多くのソフトウェアを使用していますが、いずれも cygwin や MinGW を必要としません。
C++ のベスト プラクティス プログラミングに関する私の理解では、プラットフォームに中立なコードを適度に記述し、コンパイル プロセス中にすべての違いに対処できるということです。
では、GCC との契約はどうなるでしょうか。Windows でネイティブに実行できないのはなぜですか?
編集:
さて、これまでの2つの回答は、基本的に「GCCはposixヘッダーを使用するため、posixレイヤーを使用します」と言っています。
しかし、それは実際には質問に答えません。
お気に入りの標準ライブラリ用の一連のヘッダーが既にあるとしましょう。なぜまだ posix ヘッダーが必要なのですか?
GCC は、実際にRUNするために cygwin/mingw を必要としますか?
それとも、ヘッダーとライブラリのエミュレーション レイヤーだけが必要ですか? もしそうなら、必要なリソースを含む「lib」ディレクトリを与えることができないのはなぜですか?
もう一度編集:
わかりました、私は質問を明確にするためにもう一度試みます...
また、D プログラミング言語でコードを書きます。公式のコンパイラは「dmd」という名前で、Windows と Linux の両方に公式のコンパイラ バイナリがあります。
Windows バージョンでは、POSIX エミュレーションは一切必要ありません。また、Linux バージョンでは、Win32 エミュレーションは一切必要ありません。コンパイラがその環境に関する仮定を持っている場合、コンパイラはそれらの仮定をかなりうまく隠します。
もちろん、標準ライブラリの場所と、静的または動的にリンクするライブラリの場所をコンパイラに指示する必要があります。
対照的に、GCC は posix 環境で動作しているふりをすることを主張し、エミュレーション レイヤーをセットアップすることによって、これらの仮定をユーモアを交えて表現するように ME に要求します。
しかし、正確には、GCC 内でその層に依存しているものは何でしょうか? stdlib ヘッダーを探しているだけで、「/usr/lib」内にそれらのヘッダーが見つかると想定していますか?
その場合、「C:/gcc/lib」を調べてそれらのヘッダー ファイルを見つけるように指示することはできませんか?
それとも、GCC 自体が POSIX ライブラリに依存してファイル システムにアクセスする (およびその他の低レベルの操作を行う) のでしょうか。そうであれば、お気に入りの Windows POSIX ライブラリに静的にリンクしないのはなぜだろうか。ユーザーが依存関係をアプリケーションに直接組み込むことができるのに、なぜユーザーが依存関係をセットアップする必要があるのでしょうか?