Programming Field - プログラミング Tips

MinGW: gcc ではなく ld を使ったリンク方法(Windowsアプリ)

MinGW で、gcc (または g++; 以下 gcc) コンパイラに -c オプションをつけて一時ファイルを作成したあと、リンクしてアプリケーションを作るとき、例えば

gcc -o testapp.o -c testapp.c
gcc -o testapp -mwindows testapp.o
strip testapp.exe

のようにコマンドを指定しますが、本来 gcc はコンパイラであり、リンカは ld です (gcc が内部で ld を呼び出しています)。そこで、ld を使ってビルドする場合、コマンドは以下のようになります。

gcc -o testapp.o -c testapp.c
ld -o testapp.exe -Bdynamic $(MINGW_DIR)/lib/crt2.o \
    $(MINGW_DIR)/lib/gcc/mingw32/3.4.2/crtbegin.o \
    $(MINGW_DIR)/lib/gcc/mingw32/3.4.2/crtend.o \
    -L$(MINGW_DIR)/lib/gcc/mingw32/3.4.2 --subsystem windows -s \
    testapp.o -lmingw32 -lgcc -lmoldname \
    -lmingwex -lmsvcrt -lkernel32 -lcomdlg32 -luser32

※ 行末に \ 記号を置いていますが、これはメイクファイルを作るとき、行をつなげるときに必要なもので、メイクファイルを利用しない場合は、\ を取っ払って行をすべてつなげてください。
※ $(MINGW_DIR) は環境変数 MINGW_DIR の値を表します。メイクファイルではこのまま使用できるはずです。
3.4.2 の部分は gcc のバージョンにあわせてください。

とても長くなりますが、ld ではいろいろな細かいオプションを指定することも出来る(gcc でも -Xlinker オプションで指定可能ですが)ので、複雑なアプリケーションを開発するにはこちらが優れているかもしれません。

なぜ長くなるかというと、gcc は内部でリンカを呼び出しますが、そのときにビルドするアプリケーションに通常必要なオプションを自動的に加えるためで、それらを省略しない場合に上記の長いオプションになる、ということです。