Cygwinは、ホームページ(http://www.cygwin.com)にも書いてありますが、
Cygwin is a Linux-like environment for Windows. It consists of two parts:
A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality.
A collection of tools which provide Linux look and feel.
要するに、Linux (またはUNIX)と同じような環境を、Windowsの上で模擬して実現 する仕組なのです。Linux/UNIXの基本の環境はコンソール(文字端末)での操作、 ということで、コンソールで使うことになるわけです。
(注)もちろん、最近のLinux/UNIXはウィンドウシステム(X Window Systemと呼ぶ)
を使って、MS Windowsのウィンドウと同じような環境を提供します。
(歴史はX Window Systemの方がMS Windowsより古いのではないかな?
X Window Systemの簡単な説明は、たとえばhttp://ja.wikipedia.org/wiki/X_Window_Systemを参照)
CygwinからX Window Systemを利用する(呼び出す)こともできます。具体的には
ツールキットと呼ばれるライブラリを用意して、そのライブラリの提供するAPI
(要するに関数)を利用することになります。ツールキットはLinux/UNIX環境で
いくつか用意されていて、それをCygwinで使えるようにした(ポートした)ものが
提供されています。
但し、いずれもX Window 画面を表示した中で描画するものですから
MS Windowsの画面の中にX Window Serverの窓を開いてその中で利用することに
なります。直接MS Windowsの画面の中に書くものではありません。
では、Windowsの画面の上でウィンドウを使う(作って使う)にはどうすればいいか、 ということになります。ここではC言語(C++も含めて)に限定しましょう。 それでも、たくさんの方法があります。
ここでは、既にCygwinを使ってきた人たちを対象として、Cygwinプラスアルファという形でのMS Windowsアプリケーションの作り方を紹介します。
では、Cygwinは何を提供してくれているのか、少し技術的な側面を見てみます。
面倒な人は、残りは飛ばしてかまいません。
Cygwinは、最初に断ったように、MS Windows OS上でLinux/UNIXの環境を提供することが 目的です。その中でC言語のプログラム開発ができるのです。(思い出してください。 LinuxやUNIXの大半のコードはC言語で書かれていて、様々なツールもC言語で作られて います。だからC言語を処理できることが必須なのです) 「Linux/UNIXの環境」と いうのは、具体的には
では、アプリケーションプログラムを作る立場から見るとどう見えるか。 Linux/UNIXのアプリケーションをそのままCygwinで動かすには、Cygwinの 提供するOS機能呼出しを利用するように設定する(コンパイルする)ことと、 Linux/UNIXのツールを使う場合にはそれを利用するように設定する(コンパイル・ リンクする)ことが必要です。これらは、Cygwinでgccを使うときの デフォルト(黙っているとこうなるという設定)になっています。
もし、アプリケーションプログラムがMS Windowsの持つ機能を使いたければ、 MS Windows機能の呼出しの仕組を追加する必要があります。いろいろな呼出し レベルがあるのですが、たとえばもっとも原始的な呼出しの仕組(API)である Win32 APIを使ってみるという方法があります。Win32 APIの簡単な説明として、 たとえばhttp://ja.wikipedia.org/wiki/Windows_APIがあります。
ここで注意しなければならない点があります。もしWin32 APIを使うとすると、 (1)CygwinのサービスとWin32のサービスが衝突するものがある、(2)衝突はしないが、 Cygwinのサービスで(MS Windowsのウィンドウ環境で実行するアプリケーションとして 見ると)余分なものがある、という点です。つまり、Cygwinが作ろうとしている 環境のうち、Win32 APIの環境にぶつかる部分や不要な部分が出てくるということです。
これらは、取り除いてやる必要があります。Cygwinでは既にこのようなユーザの ために、ぶつかる機能・不要な機能を盛り込まないオプションを用意してくれて います。そのオプションは、gccのデフォルトではないので、あなたが自分で 指定する必要があります。それが注意点です。