今回はVisual Studio 2019でwxWidgets 3.0.5のビルドが失敗する問題と、MinGW-w64でwxWidgets 3.1.4のビルドが失敗する問題の対策です。
wxWidgets 3.0.5 + Visual Studio 2019
問題
wx/wxcrt.hの中のwxStroll()に関してテンプレートのエラーが吐かれます。wx/wxcrt.hにてwxNEEDS_DECL_BEFORE_TEMPLATEが定義されてないのが問題です。
対策
次のようなヘッダファイルを作り、エラーが生じているソースの先頭でインクルードすればよいです。
#if defined(_MSC_VER) && _MSC_VER >= 1500 #ifndef wxNEEDS_DECL_BEFORE_TEMPLATE #define wxNEEDS_DECL_BEFORE_TEMPLATE #endif #endif
wxWidgets 3.1.4 + MinGW-w64
問題
libwxmsw31u_core.aとのリンクが失敗し、大量のundefined referenceが出力されます。wxWidgetsがMinGWのlibuxtheme.aとliboleacc.aとのリンクに失敗しているのが原因です。
対策
MinGWをインストールしたディレクトリからlibuxtheme.aとliboleacc.aをコピーし、wxWidgets/lib/gcc_libの中に置きます。MinGW-w64のデフォルトのディレクトリ構成ならば、mingw64/x86_64-w64-mingw32/lib/の中にあります。バッチファイルでコピーする場合には、次のようなスクリプトを書けばよいです。
for /f "usebackq" %%A in (`where.exe mingw32-make`) do set MINGW_MAKE_PATH=%%A cd libs @if not exist tmp ( mkdir tmp ) powershell cp "%MINGW_MAKE_PATH:~0,-21%\\*-mingw*\\lib\\liboleacc.a" "tmp\\liboleacc.a" powershell cp "%MINGW_MAKE_PATH:~0,-21%\\*-mingw*\\lib\\libuxtheme.a" "tmp\\libuxtheme.a" copy "tmp\\liboleacc.a" "wxWidgets\\lib\\gcc_lib\\liboleacc.a" copy "tmp\\libuxtheme.a" "wxWidgets\\lib\\gcc_lib\\libuxtheme.a" cd ..
素直にVisual Studioを使おう
CMakeのwxWidgetsのモジュールでは、wxWidgets/lib/vc_libとwxWidgets/lib/vc_x64_libとwxWidgets/lib/gcc_libしか検索を行わないため、MinGWを利用したときに32 bitと64 bitを自前で使い分けないといけません。また、今現在のMinGWでビルドを行うと、古いスタイルのリソースを参照するため、wxWidgetsとVisual StudioのwxWidgetsでは見た目が異なります。