39

私は 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 ライブラリに静的にリンクしないのはなぜだろうか。ユーザーが依存関係をアプリケーションに直接組み込むことができるのに、なぜユーザーが依存関係をセットアップする必要があるのでしょうか?

4

11 に答える 11

37

実際、質問の前提は間違っています。MinGWGCCはCygwinを必要としません。

Cygwinはまったく必要ないことがわかります。Windows上でネイティブに実行されます(少なくとも32ビット)。ツールチェーンと生成されたバイナリはどちらもCygwinから独立しています。

Cygwinで使用可能なMinGWコンパイラは異なります。Cygwinプラットフォーム上に構築されており、Cygwinランタイムに依存しないコードを生成します。その場合、コンパイラ自体はCygwinに依存します。しかし、それはCygwinからインストールしたためです。

于 2008-10-26T12:36:21.360 に答える
29

GCCのCygwinバージョンでは、コンパイルするプログラムのためにCygwinをインストールする必要があります。

MinGWバージョンは、Windows の作業コピー以外、コンパイル後に何も必要としません。

Cygwin はプリコンパイル済みライブラリのパスを変更するため、Cygwin 環境と MinGW コンパイラを実際に混在させることはできません。

bash スタイルのシェルが必要だが、Cygwin を使用したくない場合は、MSYSをお勧めします。

MinGWとは対照的なCygwin

MinGW Wikiからのコピー

Cygwin アプリケーションは原則として「ネイティブ Win32 アプリケーション」とは見なされません。これは、Cygwin® POSIX エミュレーション DLL または Posix 関数に依存し、cygwin1.dllwin32 関数を直接使用しないためです。一方、MinGW は、Win32 API によって提供される機能を提供します。アプリケーションを MinGW に移植する際、Win32 にネイティブではない機能 ( などfork())mmap()ioctl()、アプリケーションが適切に機能するには、同等の Win32 に再実装する必要があります。

于 2008-12-10T00:49:36.047 に答える
7

私は、WindowsでのプログラムをWindowsの市民のように振る舞わせ、LinuxでのプログラムをLinuxの市民のように振る舞わせるようにしています。

于 2008-11-04T10:48:19.087 に答える
7

POSIX (Portable Operating System Interface) は、「IEEE によって作成され、ANSI および ISO によって標準化されている、進化し、成長しているドキュメントです。POSIX の目標は、アプリケーションのソース コードの移植性です」[1]。

実際には、目標は、1 つのソース実装を記述し、それを再コンパイルするだけで異なる (POSIX 準拠の) システムで実行できる能力として定義されます。

GCC はその約束を実現できるコンパイラであるため、マシンを POSIX 標準に「近づける」コード層が必要です。

それがあなたの質問に対する答えの核心です。

私が言いたいことを理解するのを助けるために、私はあなたにこの演習を提供します:

  • OS 固有の #ifdefs を使用せずに、ユーザーからの入力としてディレクトリ パスを受け取り、その内容のリスト (1 レベル) を stdout に書き込むプログラムを作成します。

UNIX または LINUX システムでコンパイルできるネイティブ WIN32 API のみを使用するコードを作成するのは非常に難しいことがわかると思います。

POSIX API を使用するコードを作成することは、どの LINUX ボックスでもできるように、少しだけ難しくなり、Windows でコンパイルできます (DevStudio2005 には現在、驚くほど多くの POSIX 準拠のヘッダーがあります...近い)。

上記の LINUX プログラムを取得し、Cygwin または MinGW で実行されている GCC でコンパイルします。コンパイルして実行するに違いありません。

GCC はどのようにしてその魔法を実行したのでしょうか? Cygwin または MinGW によって提供される POSIX ヘッダーとその基礎となる実装。

Windows での Cygwin/MinGW への GCC の依存は、より理にかなっていますか?

  1. POSIX.4: 実世界のためのプログラミング、Bill O. Gallmeister、O'Reilly & Associates, Inc.、pg 2
于 2009-04-19T03:43:18.910 に答える
3

私はC++開発者ではありませんが、常にコンパイラーに興味があり、GCCのもの(特にLLVM)をいじくり回すことに興味があります。

LLVMとGCCは関連していないことに注意してください。LLVMは主に、Chris Lattner(http://llvm.org/developers.cgi)が最新の最適化について行った調査の結果です。彼の論文はhttp://llvm.orgで入手できます。今日では、それはアップルによって大いに後援されています。GCCのC/C ++ / Obj-Cフロントエンドはllvm-gccに使用され、LLVMマシンコードを出力します(そしてllvmで大量の最適化を行った後、最終的な実行可能ファイルが出力されます)。llvm-gccは、いくつかの準備ができているC / C ++/Obj-C-frontendをLLVMに結合するための一種のハックです。

とにかく、LLVMクルーは、clangと呼ばれる独自の完全なC / C ++/Obj-Cコンパイラーも構築していることに注意してください。Cの実装はほぼ完了していますが、C ++のサポートはどんどん良くなっていますが、Obj-Cについてはよくわかりません。

したがって、誰かが「コンパイラllvm」と言った場合、彼は実際にはllvm-gccまたはclangのいずれかを意味します。LLVM自体は単なる低レベルの仮想マシンであり、静的単一代入形式の命令はほんの一握りです(約32命令、公平)が、メガトンの最適化が構文ツリーに渡されます。

于 2009-05-05T14:15:00.710 に答える
3

Windows は標準の POSIX ライブラリを提供していないため、cygwin が 1 つ (cygwin1.dll) を提供しています。cygwin に付属の gcc パッケージはそれを使用します。

一方、mingw は必ずしも POSIX レイヤーを提供するわけではありません。たとえば、私が使用するmingwのインストールには、pthreadライブラリさえありません。

必要な場合は、インストールする必要があります。Mingw-gcc は Win32 ネイティブ コードを生成します (実際には MSVCRT.DLL に依存しています)。

EDIT:あなたの編集を読んで、gcc自体がmingw/cygwinライブラリを必要とする理由を尋ねているのか、Winでgccでコンパイルされたプログラムがそれらのライブラリを必要とするのかを尋ねているのかどうかはわかりません

于 2008-10-09T16:25:11.970 に答える
3

なんで?GCCが作成されたとき、Windows 32ビットは終了していませんでした...

より正確には --- UNIX/Posix OS 向けに開発されました。その後、Windowsに移植されました。

Windows は POSIX コンピテント システムではありません。非常に基本的な機能さえ提供していません。Windows コンパイラの下で検索してみますreaddirか? statこれは非常に基本的な機能であるため、コンパイラを作成する必要があります。

明確にするために、GCC でコンパイルされたプログラムを実行するには、不足している機能を追加するために通常 1 つの mingw32.dll しか必要としませんでした。

それで... GCC が POSIX レイヤーを必要とする理由を尋ねますか? Windows OS は POSIX オペレーティング システムではないためです。

于 2009-04-19T04:45:10.273 に答える
2

さまざまなプラットフォーム用にコンパイルされたソフトウェアの多くは、MinGWでコンパイルされています。gccとの唯一の違いは、コンパイラ自体であるということです。つまり、通常はプログラムでコンパイルされるすべてのヘッダーが必要であり、通常は結果のプログラムを実行する必要はありません。

于 2008-10-09T16:18:15.637 に答える
0

gcc の MinGW-w64 ポートは、追加の依存関係なしで 32 ビットおよび 64 ビット Windows 用のネイティブ コードを作成します。簡単な入門ガイドについては、たとえばhttp://mstenberg.com/blog/2010/06/13/gcc-for-windows/を参照してください。

于 2010-06-22T19:17:03.087 に答える
0

GCC の背後にいる人々は、情熱を持って Windows を嫌っているからです (いつか Stallman を読んでください)。そのため、GCC を Windows に移植するとき、彼らはそれが別の Unix であるかのように見せかけるために最善を尽くします。

それと、コードから POSIX 依存関係を削除することに時間を費やしたくないのでしょう。

于 2010-01-10T06:27:50.050 に答える
0

pthreads または OpenMP をサポートしたくない場合は、gcc をビルドするときに posix 以外の enable-threads オプションを指定するオプションがあります。言うまでもなく、それらは十分にテストされていません。Windows スレッドでの OpenMP に対するサードパーティのクローズド ソース サポートがいくつかありますが、gcc での使用はライセンスに違反しているようです。Windows pthreads ライブラリは、Windows スレッド機能へのより高いレベルのインターフェイスであるため、パフォーマンスが低下したり、Microsoft がアフィニティ サポートを拒否したりしても、おそらく驚くことではありません。Microsoft が Windows で gcc を許容し始めたのはつい最近のことです。マイクロソフトのツールだけで再現できたとしても、gcc ユーザーから報告されたバグには対応しないと実際に言った時期がありました。

于 2015-09-06T15:32:34.627 に答える