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