山内の授業補完のページ/Windowsアプリ

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の環境」と いうのは、具体的には

  1. Linux/UNIXのOS機能呼出し(システムコール)の実現と、
  2. Linux/UNIXのOSの提供する様々なツール・ユーティリティの提供 です。前者はLinux/UNIXのOS機能呼出しを、MS WindowsのOS機能呼出しを使って 模擬実現しています。つまり、Linux/UNIXのOS機能呼出しをMS Windowsの呼出しへ 変換するような層を用意しています。(もちろん事はそう簡単ではないですが。) 後者は、前者が与えられているという前提で、様々なツール・ユーティリティを コンパイルし直したものです。たとえば、まずコンソールの実現自体がツールの 1つです(bashという「シェルプログラム」が移されています)し、 コンパイラ(gccやその中で使う本体gcc、プリプロセッサcpp、リンカーldなど) は、既に使ってきたものです。そのほか、Linux/UNIX上で使われている様々な ライブラリ(sin, cosなどの数学ライブラリが例になります)、 アプリケーション(極端にはホームページサーバーapacheなどまで)も Cygwin環境へポートされています。 実際のコード量は後者のほうがはるかに多いのですが、前者がCygwinの「ミソ」 になっているわけです。

では、アプリケーションプログラムを作る立場から見るとどう見えるか。 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のデフォルトではないので、あなたが自分で 指定する必要があります。それが注意点です。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-22 (日) 10:11:32 (4445d)