[Fedora 11]

Hello World


Win32API のメッセージボックスを表示

Win32API を直接利用した、シンプルな Hello World プログラムをクロスコンパイルしてみましょう。

List: hello.c

#include <windows.h> 

int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine,
         int nShowCmd)
{
  MessageBoxW (NULL, L"こんにちは、世界!", L"サンプル",
               MB_OK | MB_ICONINFORMATION);
  return 0;
}

Win32 GUI アプリケーションをビルドする場合、リンク時に -mwindows スイッチを指定します。コンソールアプリケーションをビルドする場合には -mconsole を代わりに指定します。なお、デフォルトは -mconsole です。

hello.exe のビルド

$ i686-pc-mingw32-gcc hello.c -o hello.exe -mwindows
$ file hello.exe
hello.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
$ i686-pc-mingw32-objdump -p hello.exe | grep "DLL Name"
	DLL Name: KERNEL32.dll
	DLL Name: msvcrt.dll
	DLL Name: USER32.dll
$ ./hello.exe &

コンパイルしたバイナリ hello.exe のファイルタイプを file コマンドで調べると、確かに Microsoft Windows の PE32 形式のファイルであることがわかります。PE32 形式については、Portable Executable を参照してください。

また i686-pc-mingw32-objdump で、プログラムが参照している DLL を調べることが出来ます。上の例で、大文字で表示されている DLL(KERNEL32.dllUSER32.dll)は、Windows のシステム DLL です。また、msvcrt.dll は、Microsoft の C ランタイムライブラリです。いまどきの Windows であれば、この DLL も標準でインストールされています。

ということで、今回ビルドしたプログラムは、単体で Windows にコピーして使用することができます。以下に wine と Windows XP で実行した例を示しました。

hello.exe の実行例 (Wine)

   

hello.exe の実行例 (Windows XP)

実行に不要なシンボルをストリップ

コンパイルしたバイナリのサイズは、メッセージボックスを標示するだけのプログラムだというのに結構なサイズがあります。これは、バイナリには実行時に必要がないシンボルも含まれているからです。こういったシンボルは strip を使って、ファイルから直接取り除くことができます。strip はファイルの形式に依存しますので、この場合、i686-pc-mingw32-strip を使います。

シンボルのストリップ

$ ll
合計 28
-rw-rw-r--. 1 bitwalk bitwalk   241 2009-01-24 01:47 hello.c
-rwxrwxr-x. 1 bitwalk bitwalk 23898 2009-04-22 19:53 hello.exe
$ i686-pc-mingw32-strip hello.exe
$ ll
合計 12
-rw-rw-r--. 1 bitwalk bitwalk  241 2009-01-24 01:47 hello.c
-rwxrwxr-x. 1 bitwalk bitwalk 5120 2009-04-22 20:55 hello.exe

なお、コンパイル時に -s スイッチを指定すれば、コンパイル・リンクの後に、実行時に不要なシンボルがストリップされます。

シンボルのストリップ (2)

$ i686-pc-mingw32-gcc hello.c -s -o hello.exe -mwindows
$ ll
合計 12
-rw-rw-r--. 1 bitwalk bitwalk  241 2009-01-24 01:47 hello.c
-rwxrwxr-x. 1 bitwalk bitwalk 5120 2009-04-22 21:07 hello.exe
(C) 2009 - 2017 Fuhito Suguri
クリエイティブ・コモンズ・ライセンス
This site by Fuhito Suguri is licensed under a Creative Commons 表示 - 継承 3.0 Unported License.
Ads by Sitemix