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をダブルクリックしても下記のようなエラーがでる。
上記の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をダブルクリックしてみよう。
成功した。
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を追加すればいい。