Qt(11)-2 Qt Creator とMinGwコンパイラを使ったQtアプリ作成
概要 : 以前、Qt (11) Qt Creator とVC++コンパイラを使ったQtアプリ作成 で Qt CreatorとVC++の組み合わせについて、簡単に解説しました。 今回は、Qt CreatorとMinGwについて簡単に解説したいと思います。
この組み合わせは、Qtで推奨?というかQt Creatorの標準的な組合せとなっています。 ただ、Qtの3.5.xまでは、GCC3系が標準でしたが、3.6.xまでは、GCC4系が標準となりました。 いずれも、GCC3系/GCC4系ともにサポート対象ですが、3.7.xからは、GCC3系がサポート対象から外れることになりました。
さあ、ここでは、WindowsでGCC3系/GCC4系を扱う時の注意すべき点として、GCCバージョンとソースコードの文字列について記述したいと思います。
作業を始める前に、ここでの作業では、GZ,7zなどの圧縮ファイルの解凍が必要となりますから、7z ダウンロードから7zをダウンロード、インストールしておきましょう。
下の方に"Qt Creator IDE"とありますので、そこからダウンロードしてください。
MinGW ダウンロード: http://sourceforge.net/projects/mingw/files/
先のインストール先から、最新のフルセットアップファイルをダウンロードします。
2010.05現在であれば、MinGW-5.1.6.exeになります。
共通に必要となるmingw用の文字コード変換ライブラリiconvをダウンロードしておきます。
2010.05現在であれば、以下のファイルが一式です。
- libcharset-1.13.1-1-mingw32-dll-1.tar.lzma
- libiconv-1.13.1-1-mingw32-bin.tar.lzma
- libiconv-1.13.1-1-mingw32-dll-2.tar.lzma
- libiconv-1.13.1-1-mingw32-dev.tar.lzma
- libiconv-1.13.1-1-mingw32-doc.tar.lzma
- libiconv-1.13.1-1-mingw32-lic.tar.lzma
- libiconv-1.13.1-1-mingw32-src.tar.lzma
少なくとも上記の上から3つのファイルは必要です。開発環境などを整えたい場合は、すべて必要です。
次に、GCC3系の場合は、以下のファイルをダウンロードします。
GCC3系は、20060117-1ビルド分をダウンロードします。20060117-2,20060117-3など、より新しいビルドがありますが、これでは、文字コードの変換ができないようです。
ここでは、20060117-1ビルド分を使うことに注意してください。
また、ダウンロードしたファイルを、すべて、MinGWのインストール先へ解凍・上書きしていきます。
- gcc-core-3.4.5-20060117-1.tar.gz
- gcc-g++-3.4.5-20060117-1.tar.gz
- gcc-ada-3.4.5-20060117-1.tar.gz
- gcc-g77-3.4.5-20060117-1.tar.gz
- gcc-java-3.4.5-20060117-1.tar.gz
- gcc-objc-3.4.5-20060117-1.tar.gz
少なくとも上記の上から2つのファイルは必要です。他の言語環境も整えたい場合は、すべて必要です。
次に、GCC4系の場合は、以下のファイルをダウンロードします。
また、ダウンロードしたファイルを、以下の順番で、すべて、MinGWのインストール先へ解凍・上書きしていきます。
- GCC4系の4.4.0のフルパッケージ
- GCC4系の4.5.0-1
- gcc-core-4.5.0-1-mingw32-bin.tar.lzma
- gcc-c++-4.5.0-1-mingw32-bin.tar.lzma
- libgcc-4.5.0-1-mingw32-dll-1.tar.lzmaa
- libgomp-4.5.0-1-mingw32-dll-1.tar.lzma
- libstdc++-4.5.0-1-mingw32-dll-6.tar.lzma
- libgfortran-4.5.0-1-mingw32-dll-3.tar.lzma
- libgnat-4.5.0-1-mingw32-dll-4.5.tar.lzma
- libobjc-4.5.0-1-mingw32-dll-2.tar.lzma
- libssp-4.5.0-1-mingw32-dll-0.tar.lzma
- gcc-ada-4.5.0-1-mingw32-bin.tar.lzma
- gcc-g77-4.5.0-1-mingw32-bin.tar.lzma
- gcc-java-4.5.0-1-mingw32-bin.tar.lzma
- gcc-objc-4.5.0-1-mingw32-bin.tar.lzma
- その他必要なライブラリ
次に、MinGWのコンパイルのための環境変数の設定を行います。
また、ダウンロードしたファイルを、以下の順番で、すべて、MinGWのインストール先へ解凍・上書きしていきます。
- PATH にMinGWのインストール先\binのパスを追加します。
例)
PATH=%PATH%;c:\MinGW\bin
ここまで設定を終えたら、一度、C++でコンパイルしてみましょう。
例えば、以下のようなソースコード(sample.cpp)を用意します。
1 2 3 4 5 6 7 | #include <stdio.h> int main () { printf("%s", "abc漢字"); return 1; } |
上記のサンプルソースコードをc:\mingw\bin というディレクトリにあるとし、以下のようにコマンド入力すると、コンパイルができます。
このときの実行ファイルは、"sample.exe"となります。
c:\mingw\bin > g++ -o sample.exe sample.cpp : エラーがあれば、ここに表示されます。 c:\mingw\bin >
作成された実行ファイル"sample.exe"を実行してみましょう。
c:\mingw\bin > sample.exe abc漢字 c:\mingw\bin >
ここでは、Qt CreatorのバイナリでOKです。最新のバージョン(2010.5現在は、1.3.1)をダウンロードし、インストールします。
ほとんどは、画面の指示に従ってインストールするだけです。
注意すべき点は、MinGWをインストールしないことです。
先にインストールしたMinGWを使用します。
同梱されているMinGWは、GCC3系/GCC4系にかかわらず、ソースコードの文字コード、及びリテラル文字列がUTF8の場合を除き、問題となるので、
ここでは、インストールしないことに注意してください。
そのため、インストールの4画面目で"MinGW"のチェックを外しましょう。

次に、Qt Creatorを起動して、Qt ライブラリの設定をします。

メニューの[ツール(T)] - [オプション(O)]を選択します。

ここで、画面左のツリーから、Qt4-Qt Versionを選択します。
画面右に自動検出が表示されますから、その中に、今回指定したいQtライブラリ(SDK)のパスがある場合は、それを選択します。
もし、見当たらない場合は、マニュアルを選択し、画面右の+ボタンをクリックします。
子アイテムが表示されますから、それを選択し、画面右下に
- バージョン名
タイトル名として設定します。(例:4.5.3 MinGW) - QMakeのパス
ここは、Qtライブラリ(SDK)をインストールしたパス(例:C:\qt\4.5.3\qt\bin)を設定します。 - MinGWのパス
ここは、先にインストールしたMinGWのパス(例:C:\MinGW\bin)を設定します。
最後に、画面右下のデフォルト Qt バージョンに、上記で設定したバージョン名を選択して、適用ボタンをクリックします。
次にデバッガを指定します。
画面左のツリーから、デバッグ-Gdbを選択します。

画面右のGdbのパスに、Gdbの実行ファイルをフルパスで指定します。(例:C:\MinGW\bin\gdb.exe)
もし、gdb.exeが、どこにもないようであれば、以下からダウンロードし、gdb.exeのみを適当なディレクトリへ解凍しましょう。
その解凍先を、ここに指定します。
ダウンロード先:http://ftp.gnu.org/gnu/gdb/
2010.05現在では、gdb-7.1.tar.gz が最新のようなので、これをダウンロードし、解凍して使います。

[プロジェクト] - [Qt4 GUI アプリケーション]を選択します。

プロジェクト名、プロジェクト保存先パスを設定します。

必要なQtライブラリがあれば、ここでチェックします。今回は何も必要ないので、そのままです。

クラス名、基底クラス、ヘッダファイル、ソースファイル、フォームを作成する、フォームファイルなどを指定します。
ここでは、基底クラスをQDialogを選択します。

確認画面です。

自動的に作成したプロジェクトが開きます。

プロジェクトをビルドしてみましょう。

プロジェクトをデバッグ実行してみましょう。

画面のパーツが何もない画面が表示されます。

基本的にMinGWは、文字コードを問いません。逆にいえば、デフォルトの動作は、すべて文字コードがASCII(Laten)と認識されるということでもあります。 特に何も指定しない場合は、プログラム内部の文字コードは、ソースコードの文字コードで扱われることになります。 この点、VC++でも同様です。VC++の日本語版を使っていれば、SJIS,UNICODE(UTF-16)でも使えます。ソースコードの文字コードにて、内部で扱う文字リテラルが、ShiftJISになるかUNICODEになるか決定します。
#include <string.h> #include <stdio.h> int main () { const char *asample = "ab漢字"; int nsize=(int)strlen(asample); printf("[%d]%s\n", nsize,asample); return 1; }
例えば、上記のコードをShiftJISで保存したものとUNICODE(UTF-8 BOMあり)で保存したものをclコマンドでコンパイルしてみます。
C:\vc > cl sample_sjis.cpp C:\vc > cl sample_utf8.cpp
これをそのまま、DOSのプロンプトから実行します。
C:\vc > sample_sjis.exe [6]ab漢字 C:\vc > sample_utf8.exe [8]ab貍「蟄・
ちゃんと、6バイトデータ、8バイトデータとして見れています。 UNICODEの場合は、出力文字列がUNICODE(UTF-8)のため文字化けしています。
続けて、MinGWで同じようにやってみましょう。
C:\MinGW > g++ -o s_sjis.exe sample_sjis.cpp C:\MinGW > g++ -o s_utf8.exe sample_utf8.cpp sample_utf8.cpp:1: error: stray '\239' in program sample_utf8.cpp:1: error: stray '\187' in program sample_utf8.cpp:1: error: stray '\191' in program : : : : C:\MinGW >
上記のように、MinGWでは、というよりGCCでは、UNICODEにBOMがあると正しくコンパイルできないのです。 ここで、UTF-8 BOMなしのファイル"sample_utf8n.cpp"を作成して同じようにコンパイルしてみましょう。
C:\MinGW > g++ -o s_utf8n.exe sample_utf8n.cpp C:\MinGW >
これで、とりあえず、VCと同じことができました。 それぞれ実行してみましょう。
C:\MinGW > s_sjis.exe [6]ab漢字 C:\MinGW > sample_utf8n.exe [8]ab貍「蟄・
GCCの場合は、入力の文字コードと実行ファイルの文字コードを、それぞれ指定することができます。 では、UTF-8のソースコードをShiftJISの実行ファイルへ変換してみましょう。
C:\MinGW > g++ -o s_utf8_sjis.exe -finput-charset=utf-8 -fexec-charset=CP932 sample_utf8.cpp C:\MinGW > s_utf8_sjis.exe [6]ab漢字 C:\MinGW >
こんな感じで、UNICODE(UTF-8)のソースコードから今までのShiftJISのWindowsアプリケーションを作成できました。
さて、ShiftJISで記述されたソースコードは、このままで良いかというと、違います。
同様に、ソースコードがShiftJISであると指定してあげないと正しくコンパイルできないことがあります。
以下のShiftJISのソースコードをコンパイルしてみましょう。
#include <string.h> #include <stdio.h> int main () { const char *asample = "ソ"; int nsize=(int)strlen(asample); printf("[%d]%s\n", nsize,asample); return 1; }
このようにエラーが出力されてしまいます。
これは、GCCがあくまで文字コードがASCII(laten)と認識している証拠です。
C:\MinGW > g++ -o s2_sjis.exe sample2_sjis.cpp sample2_sjis.cpp: In function `int main()': sample2_sjis.cpp:6: error: missing terminating " character sample2_sjis.cpp:7: error: expected primary-expression before "int" sample2_sjis.cpp:7: error: expected `,' or `;' before "int" sample2_sjis.cpp:8: error: `nsize' was not declared in this scope C:\MinGW >
このようなソースコードを正しくコンパイルするには、以下のように指定してあげるとうまくいきます。
C:\MinGW > g++ -o s2_sjis.exe -finput-charset=CP932 -fexec-charset=CP932 sample2_sjis.cpp C:\MinGW > s2_sjis.exe [2]ソ C:\MinGW\3>
これで、ShiftJISで記述されたソースコードがコンパイルできましたね。
ここまでを踏まえて、Qt Creator + MinGWで日本語をソースコードに埋め込んでみましょう。
VC++では、何も意識せずに日本語を記述できたと思います。しかし、MinGWでは、日本語を記述する場合は、コンパイルのオプションを先のようにソースコードの文字コードとして指定してあげる必要があります。
上記では、g++ のパラメータに直接記述していました。Qt Creatorでは、プロジェクトファイルに記述することになります。
QMAKE_CXXFLAGS += -finput-charset=CP932 -fexec-charset=CP932
このように追加すれば、ShiftJISで記述されたソースコードでShiftJISのWindowsアプリケーションを作成することができます。
また、UTF-8のソースコードであれば、以下のようにすれば良いでしょう。
QMAKE_CXXFLAGS += -finput-charset=UTF-8 -fexec-charset=CP932
また、以下のようにプロジェクトの設定の中で、エディタの文字コードを指定することもできます。

では、先の何もないダイアログ画面を表示するQtアプリケーションでタイトルに日本語を直接表示させてみましょう。
以下のようにタイトル表示する9行目に追記します。
1 2 3 4 5 6 7 8 9 10 | #include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowTitle ( QString::fromLocal8Bit("ソフトウェアのタイトル") );
} |
どうしても、Windowsに慣れている筆者などは、VC++の利便性からすると、面倒だなぁと思ってしまいますね。
もっと、Qt関連について詳しく知りたい方は、以下の本なども良いと思います。Qtに関する日本語の本が少ないですね。「入門書」は、さすがに、このページを読まれるくらいの方は不要だと思います。
やっぱり、本+ネット+試してみる!!の3本柱でやっていく以外にないように思います。
![]() 入門 Qt 4 プログラミング | ![]() Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS) | ![]() 24時間集中講座 Qtプログラミング | ![]() Qtプログラミング入門 | ![]() Qt GUIプログラミング (C magazine) |







