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

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

<


  • 参考
  • [https://stackoverflow.com/questions/62827741/vs2019-wxwidgets-sample-hello-world-wxstrcoll-not-found:title]
  • [https://forums.wxwidgets.org/viewtopic.php?t=44355:title]