W.I.S. Laboratory
menu-bar

Windows MinGW-w64


Windows版MinGW-w64でexe(GUI)を作成する

難しいことを考えずに、とにかく最短で環境構築してC言語から64bit版(x64版)のexeファイルを作りたかったのでやってみた。

1. MinGW-w64をインストールする

  1. http://mingw-w64.org/ からWindows版をダウンロードしてくる(Downloads → MingW-W64-builds → Installation: Github → Assets内の「x86_64-12.1.0-release-posix-seh-rt_v10-rev3.7z」 リンクをクリック)
  2. C:\mingw フォルダを作成し、そこに7zファイルを解凍する

2. パスを通す

  1. スタートボタン右クリック→「システム」をクリック
  2. 「システムの詳細設定」をクリック
  3. 「環境変数」をクリック
  4. 「Path」をクリック
  5. 「編集」をクリック
  6. 「参照」をクリック
  7. C:\mingw\mingw64\bin を開いて「OK」をクリック

3. インストールがうまくいっているかテストする

コマンドプロンプト(cmd.exe)を起動して、「gcc -v」と入力してエンターキー。
ズラズラ~っとバージョン情報が出てきたら、インストールとパス通しはうまくいっている。
バージョン情報が出てこないときはパスが通っていない可能性があるので、一度Windowsを再起動してみる。

4. コンパイルのためのbatファイルを作成する

適当なテキストエディタを開いて、以下のバッチをコピペする。

「cc.bat」などと適当な名前を付けて(といっても gcc.bat は gcc.exe と被るので避けたほうが良い)、パスの通ったところに保存するか、ソースファイルと同じ場所に保存しておく。
以上で下準備完了。

5. ソースリストを作成する

早速Cを書いてみる。
とりあえずGUIのHello worldを。

「hello.c」とか名前を付けて、Shift-JISで保存する。(UTF-8とかだと日本語が化ける)

6. コンパイルする

コマンドプロンプトを起動し、hello.c があるフォルダに移動する。

例)d:\mydevelop 内に保存したのなら
d:
cd \mydevelop
でOK。

cc hello」と入力(拡張子は不要)してエンターキー。
これでコンパイル(とリンクが)できる。
エラーが出なければ(というか何も出なければ)、同一フォルダ内に「hello.exe」が出来上がっているはず。

7. 実行してみる

hello」と入力してエンターキー。(もちろん hello.exe をダブルクリックしても良い)
メッセージボックスが表示され、その中に「Hello world.」その下に「OK」ボタンが出てくれば成功。

8. ウィンドウを作成して何か動かしてみる

デバイスコンテキストを使って描画してみました。
とくに意味はありません。
最近YoutubeのBGM系なんかを見てるとこんな画面があったので真似して作ってみました。
解説のために細かくコメントを入れてます。
バグ(メモリ系)があったらすみません。


以下、簡単な解説です。


ダウンロードする7zファイルの種類について

  • i686 / x86_64 ・・・ アーキテクチャの種類。i686が32bit、x86_64が64bit。
  • win32 / posix ・・・ スレッドモデル。win32はWindowsネイティブでその分速いが、時代的にposixが良いと思う。
  • seh / sjlj ・・・ 例外処理ハンドリング。seh は Structured Exception Handling の略、sjlj は SetJump / LongJump の略。sehはWindowsネイティブ。

gcc のオプションについて

  • -o ・・・ 生成されるexeのファイル名を指定する。省略すると必ず a.exe になる。
  • -lgdi32 ・・・ Windows GDIを使用するプログラムをコンパイルする際に必要なオプション。
  • -W ・・・ Warningを表示する。-Wall も付けると更に細かくチェックしてくれる。
  • -Wl,-subsystem,windows ・・・ 生成したexeを実行したときにコマンドプロンプトを開かないようにする。標準出力も塞いでしまうので、printf関数やputs関数を使ったプログラムをコンパイルするときにこのオプションが付いていると何も表示されなくなる。作成時やデバッグ時にはこのオプションを付けないほうが無難。
  • -std=c++17 ・・・ C++文法をC++17に準拠するためのオプション。
  • -static -lgcc -lstdc++ -lwinpthread ・・・ C++コンパイラ(g++.exe)でC++ソースをビルドすると、「libgcc_s_seh-1.dll, libstdc++-6.dll, libwinpthread-1.dll」という3つのdllファイルにパスが通っていないと動作しない実行ファイルが生成される(これらのdllはMinGW-w64のインストールフォルダ内の mingw64\bin 下にある)のだが、この3つのdll不要の実行ファイルを生成するためのオプション。(その代わりdllの内容がexeに内包されるのでファイルサイズが大きくなるが)

batファイルについて

カレントディレクトリに、拡張子が ".c" または ".cpp" のファイルがあれば、それをコンパイルします。
とりあえずコンパイル&リンクしてexeを作成するだけの簡単なものです。
このbatでは単一のCソースしかコンパイルできませんが、本来gccは複数のCソースを連結してコンパイルできます。

データ型モデルなどについて

MinGW-w64の型のサイズは以下のようになっている。
  • char : 8bit (-128~127)
  • short : 16bit
  • int : 32bit
  • long : 32bit
  • long long : 64bit
  • float : 32bit
  • double : 64bit
  • long double : 128bit
LP64ではなくLLP64を採用しているようで、long型は32bitとなる。
Microsoft VC++に合わせてあるようだ。
MinGW-w64をVC++の代替手段だと考える人には好都合、Windows上で使えるGCCだと考える人には違和感。
64bitの値を扱いたい時はlong long型にする必要がある。
char型の範囲は-128~127なので、これもVC++に合わせてあるようだ。
0~255で扱いたい時はunsigned charを使うか -funsigned-char オプションを付けてコンパイルする必要がある。


[ 戻る ]
saluteweb