2017年12月13日

wxWidgets のクロスコンパイル

 wxWidgets の開発環境整備の件。調べてみると、先人がいらっしゃった。すばらしい。「Mac OSX El CapitanにwxWidgetsのwin32クロスコンパイル開発環境構築しました。」(黄昏フリーランスの日記) こちらを参考にして、うちでも開発環境を整備してみる。

 クロスコンパイラはこちらから。

 32 bits targets (2013/05/31), 64 bits targets (2013/06/22) がある。当面は、32 bits でいくことにする。

 展開して /usr/local にインストール。

$ cd path/to/Downloads
$ mkdir mingw-w32; cd mingw-w32
$ tar xvfz ../mingw-w32-bin_i686-darwin_20130531.tar.bz2
$ cd ..
$ sudo mv mingw-w32 /usr/local

 実行できることを確かめる。

$ export PATH=/usr/local/mingw-w32/bin:$PATH
$ i686-w64-mingw32-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/mingw-w32/bin/i686-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/local/mingw-w32/bin/../libexec/gcc/i686-w64-mingw32/4.9.0/lto-wrapper
Target: i686-w64-mingw32
Configured with: ../../../build/gcc/src/configure --target=i686-w64-mingw32 --prefix=/Users/nightstrike/buildbot/mw64/darwin-x86-x86/build/build/root --with-sysroot=/Users/nightstrike/buildbot/mw64/darwin-x86-x86/build/build/root --with-gnu-ld --with-gnu-as --enable-fully-dynamic-string --disable-multilib
Thread model: win32
gcc version 4.9.0 20130531 (experimental) (GCC) 

 結構古いバージョンだけど大丈夫かな。今まで MinGW 上で使っていた gcc も同じぐらいのバージョンだったから、まあいいか。

 ビルドしてみる。

$ cd path/to/wxWidgets-3.0.0
$ mkdir mswx-build; cd mswx-build
$ ../configure --host=i686-w64-mingw32 --disable-shared --enable-monolithic 2>&1 | tee configure.log
checking build system type... x86_64-apple-darwin15.6.0
checking host system type... i686-w64-mingw32
checking for --disable-gui... no
checking for --enable-monolithic... yes
...(snip)...
Configured wxWidgets 3.0.0 for `i686-w64-mingw32'

  Which GUI toolkit should wxWidgets use?                 msw
  Should wxWidgets be compiled into single library?       yes
  Should wxWidgets be linked as a shared library?         no
  Should wxWidgets support Unicode?                       yes (using wchar_t)
  What level of wxWidgets compatibility should be enabled?
                                       wxWidgets 2.6      no
                                       wxWidgets 2.8      yes
  Which libraries should wxWidgets use?
                                       STL                no
                                       jpeg               builtin
                                       png                builtin
                                       regex              builtin
                                       tiff               builtin
                                       zlib               builtin
                                       expat              builtin
                                       libmspack          no
                                       sdl                no
$ make -j 2 2>&1 | tee make.log

 2時間ぐらいかかったが、無事終了。生成したファイルは下の通り。i686-w64-minw32 がついていることに注意。

$ ls lib
libwx_mswu-3.0-i686-w64-mingw32.a	libwxregexu-3.0-i686-w64-mingw32.a
libwx_mswu_gl-3.0-i686-w64-mingw32.a	libwxscintilla-3.0-i686-w64-mingw32.a
libwxexpat-3.0-i686-w64-mingw32.a	libwxtiff-3.0-i686-w64-mingw32.a
libwxjpeg-3.0-i686-w64-mingw32.a	libwxzlib-3.0-i686-w64-mingw32.a
libwxpng-3.0-i686-w64-mingw32.a		wx
$ ls lib/wx/include
i686-w64-mingw32-msw-unicode-static-3.0

 wxWidgets のサンプルをビルドしてみた。ちゃんと動きます。VMWare 上の MinGW/MSYS でビルドしていた時と比べると、make が普通に速いのが本当に快適です。

1213-1.png

 自分のプロジェクトをビルドしてみると、undefined reference to `....' というリンクエラーが大量に出た。Makefile を調べてみると、ar, ranlibi686-w64-mingw32- がついていなくて、Mac のバージョンが呼び出されていた。そりゃエラーになるわな。要注意。

Posted at 2017年12月13日 23:35:18
email.png