今回はVisual Studio 2019でwxWidgets 3.0.5のビルドが失敗する問題と、MinGW-w64でwxWidgets 3.1.4のビルドが失敗する問題の対策です。
[:contents]
- wxWidgets 3.0.5 + Visual Studio 2019<hr>
** 問題 wx/wxcrt.hの中のwxStroll()に関してテンプレートのエラーが吐かれます。wx/wxcrt.hにてwxNEEDS_DECL_BEFORE_TEMPLATEが定義されてないのが問題です。
** 対策 次のようなヘッダファイルを作り、エラーが生じているソースの先頭でインクルードすればよいです。
|cpp| #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 <hr>
** 問題 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/の中にあります。バッチファイルでコピーする場合には、次のようなスクリプトを書けばよいです。
|dosbatch| 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を使おう <hr>
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では見た目が異なります。
[f:id:pit-ray:20210117103246p:plain] wxWidgets (MinGW) <
[f:id:pit-ray:20210117103625p:plain] wxWidgets (Visual Studio 2019) <
- 参考
- [https://stackoverflow.com/questions/62827741/vs2019-wxwidgets-sample-hello-world-wxstrcoll-not-found:title]
- [https://forums.wxwidgets.org/viewtopic.php?t=44355:title]