ホーム < ゲームつくろー! < IKD備忘録

GCC
WindowsでGCC

(2011. 9. 15)


 Windowsプログラムをする環境としてVisualStudioは最適に思います。ただ、VisualStudioのコンパイラはMaicrosoftの拡張部分が入っていたり、ワーニングレベルを最強にしてもちょっと甘い所があったりと、ん〜〜少しゆるりとしています。それを感じたのは職場でGCCコンパイラにコードを通した時でした。まぁーー出るわ出るわ出るわ。エラーとワーニングの嵐。VisualStudioのコンパイラではどちらもゼロのコードがです。VSに比べよりしっかりとしたコードが書ける、それがGCCかなと思います。また、マルチプラットフォーム向けのコードを書こうと思ったら、GCCの環境でコンパイルが通る事は一つの目安となります。

  そこで、VSとGCCと、両方のコンパイルを通す環境を作る事を目標に、WindowsでGCCを走らせてみることにします。そう、きっとあなたは愕然とするでしょう、あまりにビルドが通らない自分のコードに…ううぅ(T-T)


@ Cygwinを入れます

 まず「Cygwin」というコマンドライン環境をセットアップします。これはLinux環境をWindows上でエミュレートするツールです。GCCはLinux上でビルドするのです。Cygwinはこちらのサイトにある「setup.exe」というリンクから環境をダウンロードできます。

 setup.exeを実行すると、インストーラーが立ち上がります。Cygwin Setup - Choose Installation Typeでどうやってインストールするか尋ねられます。インターネット経由でインストールするなら「Install from Internet」を選択しましょう。インストール先はデフォルトで十分。「Cygwin Setup - Select Connection Type」ではネットの接続環境を問われますが、まぁ一番上の「Direct Connection」が殆どでしょう。「Choose A Download Site」ではダウンロード先のミラーサイトを選択します。国内ならば「.jp」が付いたサイトが下の方にあるので探して選択します。これでダウンロードが始まります。もしかすると「Setup Alert」というウィンドウが出るかもしれません。「Cygwinを最初にインストールするんだね。Cygwinのドキュメントをサイトで見てね。」という内容です。そのままあOKで続けましょう。

 しばらくすると「Cygwin Setup - Select Packages」ウィンドウが開きます。ここでインストールするツールを選択するのですが、まぁ当然良くわかりませんので全部インストールすることにします。Categoryというカラムにある「All」の右側にある「Default」をクリックして「Install」に変更して次へ進みましょう。「Cygwin Setup - Resolving Dependencies」という所でパッケージの依存関係について問われますが、まぁ、次へ行きましょう。これで、後は長〜〜〜いダウンロード&インストールが続きます。コーヒーでも飲んで見守っておけばそのうち終わります。

 …2時間、経ったねぇ…

 やっと終わりました。2時間以上かかりました。これでCygwinが使えるようになります。デスクトップにもショートカットが出ていると思います。この段階でGCCもインストールされているので、C++のコードをビルド出来ます。早速やってみましょう。

 まずCygwinを実行します。すると次のようなシンプルなコマンドライン画面が出てきます:

この状態でCドライブ直下に次のようなテストコードを保存しましょう:

test.cpp
class Test {
    int a, b;
public:
    Test() : b(), a() {}
    void func(int val) {}
};

int main() {
    Test t;
    t.func(10);

    return 0;
}

このコード、VisualStudio2005のワーニングレベル3では一つもワーニングが出ません。ワーニングレベル4に挙げるとTest::funcメソッドの引数valが使われていませんよというワーニングが一つ出ます。このコードをCigwin上でGCCを使って最高ワーニングレベルでビルドするには、コマンドラインに「gcc -W -Wall /cygdrive/c/test.cpp」と打ち込みます。すると、こんなワーニングがごそっと出ます:

「gcc」でgccを使いますよ〜という意味になり、-Wはワーニング出してねの意味になります。その後の-Wallはワーニングレベルを最高に設定するオプション、その後ろの「/cygdrive/c/」というのがCドライブを指定するCygwin上でのパスになります。今Cドライブ直下にtest.cppを置いたのでそういうパスを指定しています。

 肝心のワーニングですが、出ますねぇ(^-^l。「In constructor」というのは「コンストラクタを解析したときに、」という意味です。その下「'Test::b' will be initialized after」というのは、「クラスのメンバ変数の初期化の順序が宣言の順序と異なっていますよ」と警告を出されています。確かにメンバ変数aとbが、コンストラクタでは「b(), a()」の順で初期化されています。これは未初期化の変数による初期化エラーを防ぐためだと思います。valが使われていないワーニングも出ています。こんな感じでVisual Studioよりも厳しいワーニングが出ます。

 他には知らずに使っていたプラットフォーム依存な拡張を教えてくれるというのもGCCを通す理由です:

test.cpp
int main() {

    __int64 i64 = 0x00ff0f00f0f0f0f0;

    return 0;
}

これはVisualStudioであれば通ります。しかしGCCでは次のエラーが出ます:

「__int64なんて知らないよ〜」と怒られたわけです。__int64というのはVisualStudioでの拡張型だったというわけです。こういうのはマルチプラットフォームなライブラリを作る時の思わぬ弊害となるため複数のコンパイラを通してチェックしておいた方が良いわけです。

 さて、上のビルドの方法はわかりやすく.cppが増えると破綻していきます。毎回全ファイルをコマンドラインから打ち込んでビルドしてられないわけですよ。そのために「メイクファイル」というビルドルールを決めるファイルを別に作ります。次の章でじわっと見てみます。