トリビア目次へ lnpp公式サイトへ

Cygwinのgcc(gcc-3)でcygwin.1.dllがなくても動くwindowsのプログラムを作る

ちなみに,これを書いている時点の環境は32bit版windowsにcygwinのgccがバージョン3という状況です。
……2017年にもなって今更感もするのですが……。なんていうか,時代についていけてないだけです……(sigh)。
時代についていこうとするならば,MinGWを使うことになるでしょう。(Git for windowsでいいという話もあるようですが……これはまだ私が勉強していない。)さらに先端を走ろうとするなら,LLVM ClangをMinGWに加えることになるのかな?
そして,いわゆるDOS窓からコマンドラインで使うのか,UNIXの各種ツールを使うためにmsysとかmsys2を使うのか,はたまた,POSIX準拠の環境がほしいというのでcygwinを使うけど,Cコンパイラやライブラリは,cygwinのではなく,MinGWのを使うという設定にする話になるのではないかというのが,現時点での私の判断です。
そして,cygwin.1.dll使ってでもwindowsとUNIXの連携をはかりたいのであれば,今はcygwinの他にも,もう端的にVirtualBoxなどの仮想環境を構築して,UNIXを走らせてしまった方がcygwin特有の事情を考慮せずに素直に作業ができるのではないか……なんて思っています。

さて,本題。
gccのバージョンが3の時には,gccのオプションで解決がついてしまいます。
たとえばneko.cからneko.exeを生成する場合には

gcc -mno-cygwin -o neko.exe neko.c

で,十分です。
できたneko.exeは,windowsのGUIでダブルクリックで動作しますし,windowsのコマンドプロンプトからも動きます。そしてcygwinのターミナルでも動きます。ありがたいことに,拡張子の.exeについては,コマンドプロンプトやターミナルでは省略可能です。
windowを使う場合には,

gcc -mno-cygwin -o neko.exe neko.c -mwindows

と,後に-mwindowsオプションを加えるだけです。
ちなみに,テストに使ったソースは,ダイアログを出すのがこれ,ウインドウを出すのがこれでした。いずれもhttp://takuya-1st.hatenablog.jp/entry/20120614/1339702326で紹介されたものです。
……「ヘッダファイル「windows.h」をインクルードするエントリポイントは、main関数ではなく「WinMain関数」である」という記述もあるんだけど,実はまだ検証していない。というのは,おおもとの話で,一般的にはCでは,「トップはmain関数にしなさい」とはされているんだけど,実はこれが必須ではないらしくて,実際minix1.5の頃のソースはmainではなくstartだったとか。で,似た話をウインドウを使ったプログラミングでも聞いたことがあったので……。


トリビア目次へ lnpp公式サイトへ