ただのメモ

開発で得た知識のアウトプット

Windows環境でwxWidgetsのインクルードやリンクが失敗する問題 (3.0.x, 3.1.x, Visual Studio 2019, MinGW)

今回は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.aliboleacc.aとのリンクに失敗しているのが原因です。

対策

MinGWをインストールしたディレクトリからlibuxtheme.aliboleacc.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 ..

追記

wxWidgetsのv3.1.5ではこの問題が修正されているようです。



素直にVisual Studioを使おう

CMakeのwxWidgetsのモジュールでは、wxWidgets/lib/vc_libwxWidgets/lib/vc_x64_libwxWidgets/lib/gcc_libしか検索を行わないため、MinGWを利用したときに32 bitと64 bitを自前で使い分けないといけません。また、今現在のMinGWでビルドを行うと、古いスタイルのリソースを参照するため、wxWidgetsとVisual StudioのwxWidgetsでは見た目が異なります。

f:id:pit-ray:20210117103246p:plain
wxWidgets (MinGW)
f:id:pit-ray:20210117103625p:plain
wxWidgets (Visual Studio 2019)