cygwin64でwindowsネイティブアプリ

ソースコード cygwin64でMessageBoxの文字化け回避 - プログラミングのメモ

$ PATH=$PATH:/usr/x86_64-w64-mingw32/sys-root/mingw/bin
$ x86_64-w64-mingw32-g++ -DUNICODE -std=c++11 -mwindows -Wall test.cpp -o sample.exe

$ ldd sample.exe

ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x77ad0000)
kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x778b0000)
KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x7fefdb80000)
libgcc_s_seh-1.dll => /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgcc_s_seh-1.dll (0x61440000)
msvcrt.dll => /cygdrive/c/Windows/system32/msvcrt.dll (0x7fefe3c0000)
libstdc++-6.dll => /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libstdc++-6.dll (0x6fc40000)
USER32.dll => /cygdrive/c/Windows/system32/USER32.dll (0x779d0000)
GDI32.dll => /cygdrive/c/Windows/system32/GDI32.dll (0x7fefe350000)
LPK.dll => /cygdrive/c/Windows/system32/LPK.dll (0x7fefdfa0000)
USP10.dll => /cygdrive/c/Windows/system32/USP10.dll (0x7feff7d0000)
IMM32.DLL => /cygdrive/c/Windows/system32/IMM32.DLL (0x7feff6a0000)
MSCTF.dll => /cygdrive/c/Windows/system32/MSCTF.dll (0x7fefde90000)

この状態でsample.exeをダブルクリックしても下記のようなエラーがでる。

f:id:drunkennessimi:20140215200933j:plain

上記のldd sample の結果からも分かるように libgcc_s_seh-1.dll と libstdc++-6.dll が%PATH%内に見つからないようだ。なのでsample.exeと同じディレクトリに二つのdllをコピーするかPATHを通すか、あるいはstatic linkする必要がある(file sizeは増える)。

static linkする方法は -static-libgcc (libgcc_s_seh-1.dll) -static-libstdc++ (libstdc++-6.dll)とする。

以上をふまえてもう一度コンパイルしてみよう。

$ x86_64-w64-mingw32-g++ -DUNICODE -std=c++11 -mwindows -static-libgcc -static-libstdc++ -Wall test.cpp -o sample.exe

$ ldd sample.exe

ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x77ad0000)
kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x778b0000)
KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x7fefdb80000)
msvcrt.dll => /cygdrive/c/Windows/system32/msvcrt.dll (0x7fefe3c0000)
USER32.dll => /cygdrive/c/Windows/system32/USER32.dll (0x779d0000)
GDI32.dll => /cygdrive/c/Windows/system32/GDI32.dll (0x7fefe350000)
LPK.dll => /cygdrive/c/Windows/system32/LPK.dll (0x7fefdfa0000)
USP10.dll => /cygdrive/c/Windows/system32/USP10.dll (0x7feff7d0000)
IMM32.DLL => /cygdrive/c/Windows/system32/IMM32.DLL (0x7feff6a0000)
MSCTF.dll => /cygdrive/c/Windows/system32/MSCTF.dll (0x7fefde90000)

libgcc_s_seh-1.dll と libstdc++-6.dll が消えている。

もう一度sample.exeをダブルクリックしてみよう。

f:id:drunkennessimi:20140215202528j:plain

成功した。

cmd.exe上でsample.exeでも無事にメッセージボックスがでるようになる。

環境変数PATHに追加する場合↓↓

$ cygpath.exe -w /usr/x86_64-w64-mingw32/sys-root/mingw/bin

C:\cygwin64\usr\x86_64-w64-mingw32\sys-root\mingw\bin

↑↑このPATHを追加すればいい。