wxWidgetsは、LinuxのGTK+、X11、MotifやWindows、Windows CE、Mac OS Xなどで動作するオープンソースのクロス プラットフォーム GUIライブラリである。
wxWidgetsの特色は、作成されたアプリケーションは、各プラットフォームのネイティブ コントロール/コモン ダイアログを利用するので、どのプラットフォームにおいても見た目が自然で違和感なく利用することができる。
ライブラリ自体はC++で記述されているが、開発者はC++のほか、Python (wxPython)、C# .NET (wx.NET)、Erlang (wxErlang)、Haskell (wxHaskell)、Lua (wxLua)、Perl (wxPerl)、Ruby (wxRuby)、Smalltalk (wxSqueak)、Java (wx4j)、JavaScript (wxJavaScript) 向けのバインディングを利用して、wxWidgetsベースのアプリケーションを作成することができる。
wxWidgetsの歴史については、wxWidgets(当初 wxWindows)は1992年よりJulian Smart氏によって開発が始められ、MicrosoftよりWindowsの商標を尊重するようにとの要求を受けて、2004年2月20日にプロジェクトはwxWidgetsに改名したとの発表を行った。(インターネット上で文献を探す際は、wxWindowsとwxWidgetsの両方で探すと良い。)
参考文献:
wxWidgets - Wikipedia, the free encyclopedia
GitHub - wxWidgets/wxWidgets: Cross-Platform GUI Library - Report issues here: https://trac.wxwidgets.org/ より clone する。
$ git clone --recurse-submodules https://github.com/wxWidgets/wxWidgets.git
※–recurse-submodules 無しで clone してしまった場合は以下のコマンドを実行する。
> cd wxWidgets > git submodule update --init
wxGTK2
$ sudo dnf install wxGTK wxGTK-devel
wxGTK3
$ sudo dnf install wxGTK3 wxGTK3-devel
静的リンク
$ cd wxWidgets $ ./configure --disable-shared $ make
動的リンク
$ cd wxWidgets $ ./configure $ make
変数名: WXWIN 変数値: C:\Libraries\wxWidgets
> cd %WXWIN%\include\wx\msw\ > mklink setup.h setup0.h setup.h <<===>> setup0.h のシンボリック リンクが作成されました
> cd %WXWIN%\build\msw > nmake /f makefile.vc
※デフォルトはデバッグ設定で静的ライブラリとして wxWidgets を構築する。
> nmake /f makefile.vc BUILD=release
> nmake /f makefile.vc BUILD=release SHARED=1
※TARGET_CPU=X64 を指定すると Win64 バージョンをビルドする。
Microsoft(R) Program Maintenance Utility Version 14.20.27305.0 Copyright (C) Microsoft Corporation. All rights reserved. if not exist vc_mswud_x64 mkdir vc_mswud_x64 cl /c /nologo /TC /Fovc_mswud_x64\wxregex_regcomp.obj /MDd /DWIN32 /Zi /Fd..\..\lib\vc_x64_lib\wxregexud.pdb /D_DEBUG /Od /D_CRT_SECURE_NO_DEPRECATE=1 /D_CRT_NON_CONFORMING_SWPRINTFS=1 /D_SCL_SECURE_NO_WARNINGS=1 /DNDEBUG /D_CRT_SECURE_NO_WARNINGS /I..\..\include /I..\..\lib\vc_x64_lib\mswud /D__WXMSW__ /D_UNICODE ..\..\src\regex\regcomp.c regcomp.c cl /c /nologo /TC /Fovc_mswud_x64\wxregex_regexec.obj /MDd /DWIN32 /Zi /Fd..\..\lib\vc_x64_lib\wxregexud.pdb /D_DEBUG /Od /D_CRT_SECURE_NO_DEPRECATE=1 /D_CRT_NON_CONFORMING_SWPRINTFS=1 /D_SCL_SECURE_NO_WARNINGS=1 /DNDEBUG /D_CRT_SECURE_NO_WARNINGS /I..\..\include /I..\..\lib\vc_x64_lib\mswud /D__WXMSW__ /D_UNICODE ..\..\src\regex\regexec.c regexec.c cl /c /nologo /TC /Fovc_mswud_x64\wxregex_regerror.obj /MDd /DWIN32 /Zi /Fd..\..\lib\vc_x64_lib\wxregexud.pdb /D_DEBUG /Od /D_CRT_SECURE_NO_DEPRECATE=1 /D_CRT_NON_CONFORMING_SWPRINTFS=1 /D_SCL_SECURE_NO_WARNINGS=1 /DNDEBUG /D_CRT_SECURE_NO_WARNINGS /I..\..\include /I..\..\lib\vc_x64_lib\mswud /D__WXMSW__ /D_UNICODE ..\..\src\regex\regerror.c regerror.c
include path: %WXWIN%\include;%WXWIN%\msvc library path(x86): %WXWIN%\lib\vc_lib library path(x64): %WXWIN%\lib\vc_x64_lib
以下の方法にて必要なサンプルのみをビルド/実行することができる。
> cd %WXWIN%\samples > nmake /f makefile.vc
以下のサイトを参考にさせて頂きました。情報を公開して下さっている方々に感謝します。
Microsoft Visual C++ Guide - WxWiki
フリープログラミング for windows.のVisual C++ Express EditionでwxWidgetsを使ってみる
簡単だけどつまづきやすいwxWidgetsの第一歩:CodeZine
古い wxWidgwts では wxOVERRIDE が未定義である為に発生する。
最新のライブラリを使えば問題は解決するが、自分で wxOVERRIDE を定義する事で回避可能でどのバージョンの wxWidgets でもコンパイルが可能になる。
sample.cpp:33:25: error: expected ';' at end of member declaration virtual bool OnInit() wxOVERRIDE; ^ ; sample.cpp:33:27: error: 'wxOVERRIDE' does not name a type; did you mean 'wxEVT_IDLE'? virtual bool OnInit() wxOVERRIDE; ^~~~~~~~~~ wxEVT_IDLE
エラーを回避するコードの例は以下のようになる。(wxWidgets/defs.hとほぼ同じ)
/* オーバーライドキーワードのサポートを確認する */ #ifndef HAVE_OVERRIDE #if __cplusplus >= 201103L /* すべての C++11 コンパイラはそれを持つべきです */ #define HAVE_OVERRIDE #elif wxCHECK_VISUALC_VERSION(11) /* VC++ はバージョン8以降で override キーワードをサポートしていますが、C++11 の サポートを示すものとして __cplusplus を定義していません(少なくとも 12 まで)ので、 その場合は特別に処理してください。 また、キーワードはサポートされていますが、バージョン 8、9、10 で使用すると C4481 コンパイラ警告 ("nonstandard extension used") が発生するため使用しないでください。 気にしないのであれば、この警告を無効にして HAVE_OVERRIDE を事前定義することができます。 */ #define HAVE_OVERRIDE #elif WX_HAS_CLANG_FEATURE(cxx_override_control) #define HAVE_OVERRIDE #endif #ifdef HAVE_OVERRIDE #define wxOVERRIDE override #else /* !HAVE_OVERRIDE */ #define wxOVERRIDE #endif /* HAVE_OVERRIDE */ #endif /* !HAVE_OVERRIDE */