|
本サイトは移転しました。旧アドレスからのリダイレクトは2025年03月31日(月)まで有効です。
|
🛈 | ✖ |
wxWidgetsライブラリを自分でビルドする手順を説明し、これを含めたデバッグ方法を示す。
本サイトはMSYS2でwxWidgetsライブラリを導入した。これは簡便であるものの必ずしも最新版が得られず、ライブラリ内部までデバッガが追跡できないというデメリットがある。本記事はwxWidgetsをソースコードからビルドするが、特にデバッグバージョンでライブラリ内部までデバッガを追跡させるための方法を示す。本記事はバージョン3.1.4を前提に記述する。
リンク先からwxWidgets-3.1.4.zipをダウンロードする。
ディレクトリは以下とする。異なるバージョンのソースコード展開ディレクトリはwxWidgetsルートの配下に並列させる。
| 目的 | ディレクトリ |
|---|---|
| wxWidgetsルート | C:\wxWidgets |
| ソースコードの展開 | C:\wxWidgets\wxWidgets-3.1.4 |
| ビルドの出力 | C:\wxWidgets\wxWidgets-3.1.4\my_builds\[ビルド名] |
zipファイルをwxWidgetsルートに置きエクスプローラー右クリック[すべて展開]で[圧縮(ZIP)形式フォルダーの展開]ダイアログをデフォルトのまま[展開]する。展開されるファイルには多様なビルド用ファイルが含まれるが、本サイトはconfigure(コンフィグレーションスクリプト)ファイルを用いるので他の記述は省く。本記事での相対パスは展開ディレクトリ(C:\wxWidgets\wxWidgets-3.1.4)からとする。
| ディレクトリ | ファイル | 内容 |
|---|---|---|
| C:\wxWidgets | ||
| └ wxWidgets-3.1.4 | configure | コンフィグレーションスクリプト |
| │ | Makefile.in | メイクファイル(Makefile)テンプレート |
| │ | setup.h.in | ライブラリ設定インクルード(setup.h)テンプレート |
| │ | ... | ... |
| ├ include | ||
| │├ wx | *.h | ライブラリインクルード |
| ││├ msw | *.h | ウインドウズ実装依存インクルード |
| │││ | genrcdefs.h | ウィンドウズリソース定義(rcdefs.h)テンプレート |
| ││├ ... | *.h | その他の実装依存インクルード |
| ││︙ | ... | ... |
| │└ msvc | ... | マイクロソフトVC++用の追加 |
| ├ src | ||
| │├ msw | *.cpp | ウィンドウズ実装依存ソースコード |
| │├ ... | *.cpp | その他のソースコード |
| │︙ | ... | ... |
| ├ demos | ... | (デモ用ソースコードディレクトリ) |
| ├ samples | ... | (サンプル用ソースコードディレクトリ) |
| ├ tests | ... | (テスト用ソースコードディレクトリ) |
| ├ utils | ... | (ユーティリティ用ソースコードディレクトリ) |
| ├ docs | ... | (ドキュメントディレクトリ) |
| ︙ |
例えばinclude\wx\mswディレクトリにsetup.hやrcdefs.hというファイルが存在するもののconfigureによるビルドはこれらを使わない。本サイトはsetup.h(ライブラリ設定インクルード)にパッチを当てるが、こういった理由でinclude\wx\msw\setup.hではなく展開ディレクトリのsetup.h.inにパッチを当てる。
バージョン3.1.0以降ではライブラリ設定インクルードにパッチを当ててウィンドウズのDirect2Dレンダリングサポートを有効化させる。これはマイクロソフトVC++をコンパイラとする場合はデフォルトで有効だがmingw-w64では無効となっていて、そのままでは例えばCode::Blocksがビルドできない。
setup.h.inのwxUSE_GRAPHICS_DIRECT2Dマクロ定義を以下に修正する。
既にconfigureを実行済みの場合はテンプレートファイルから作成したsetup.h(例えばmy_builds\debug64_monodll\lib\wx\include\msw-unicode-3.1\wx\setup.h)にも同様の修正を施す。
本サイトはconfigureスクリプトでメイクファイル(Makefile)、ライブラリ設定インクルード(setup.h)、ウィンドウズリソース定義(rcdefs.h)などを作成し、MSYS2のmakeコマンドツールでビルドする。configureはautomakeツールが生成したソースコード修正スクリプトで、Makefile.inとsetup.h.inにオプション修正を施してMakefileとsetup.hを出力する。rcdefs.hはgenrcdefs.hからC++プリプロセッサで生成する。configure、Makefile.in、setup.h.in、genrcdefs.hはwxWidgetsの配布ソースコードに同梱されている。configureとmakeはMSYS2環境を前提とし、mingw32/mingw64サブシステムのPOSIX互換ターミナルで作業して32ビット/64ビットライブラリをビルドする。
32ビット/64ビットの選択以外はconfigureオプションで設定する。本サイトのオプション設定は以下に限定するが、設定可能な全オプションはconfigure --helpで知ることができる。
| configureオプション | 機能 | 有 | 無 |
|---|---|---|---|
| --enable-monolithic | 単一ファイルにビルドする(モノリシック) | モノリシック | 非モノリシック |
| --enable-debug | デバッグ用ライブラリをビルドする | デバッグ(-g -O0) | リリース(-O2) |
| --disable-shared | スタティックリンクライブラリをビルドする | スタティック(lib) | ダイナミック(dll) |
以下に各ビルドのオプションをまとめるが、本当に必要とするものだけをビルドすれば良い。本サイトもdebug64_monodllとreleasel64_monodllのみビルド確認している。
| ビルド名 | サブシステム | configureオプション |
|---|---|---|
| debug32_monodll | mingw32 | --enable-monolithic --enable-debug |
| debug32_monolib | --enable-monolithic --enable-debug --disable-shared | |
| debug32_polydll | --enable-debug | |
| debug32_polylib | --enable-debug --disable-shared | |
| release32_monodll | --enable-monolithic | |
| release32_monolib | --enable-monolithic --disable-shared | |
| release32_polydll | ||
| release32_polylib | --disable-shared | |
| debug64_monodll | mingw64 | --enable-monolithic --enable-debug |
| debug64_monolib | --enable-monolithic --enable-debug --disable-shared | |
| debug64_polydll | --enable-debug | |
| debug64_polylib | --enable-debug --disable-shared | |
| release64_monodll | --enable-monolithic | |
| release64_monolib | --enable-monolithic --disable-shared | |
| release64_polydll | ||
| release64_polylib | --disable-shared |
展開ディレクトリにmy_buildsディレクトリを作成し、さらに各ビルドの出力ディレクトリを作成する。同梱のドキュメント(docs\msw\install.md)は展開ディレクトリ配下に出力を置くことを推奨しないが、複数バージョンの管理を容易とするため本サイトはあえてこの方法を選択する。configure、makeの実行は環境変数WXWINに展開ディレクトリ名が代入されている必要がある。
configureの作成するMakefileはinstallフォニーターゲットを持つが、これをターゲットとしてメイクする(make install)とmingw32/mingw64サブシステムのinclude/lib/binディレクトリのwxWidgetsファイルを上書きする。本サイトのセットアップはMSYS2で既にwxWidgetsライブラリを導入しており、この上書きは危険な結果を招きかねない。デフォルトターゲットによるメイク(make)でカレント配下への出力に限定してMSYS2導入や他バージョンとの共存を図る。
debug64_monodllを例にビルド方法を示す。
configureおよびmakeが出力ディレクトリ(my_builds\debug64_monodll)に生成するファイルの配置を示す。configureは...\Makefile、...\lib\include\msw-unicode-3.1\wx\setup.h、...\lib\include\msw-unicode-3.1\wx\msw\rcdefs.hを生成する。makeはMakefileを用いて...\libディレクトリにライブラリファイルを出力する。なおconfigureは他にデモ、サンプル、テスト、ユーティリティをビルドするための...\demos、...\samples、...\tests、...\utilsディレクトリを作成して各プロジェクトのMakefileを配置するが、それらのソースコードは展開ディレクトリ直下の同名ディレクトリに存在する。
| ディレクトリ | ファイル | 内容 |
|---|---|---|
| C:\wxWidgets | ||
| └ wxWidgets-3.1.4 | ... | ... |
| ├ include | ||
| │︙ | ... | ... |
| ├ src | ||
| │︙ | ... | ... |
| ├ my_builds | ||
| │├ debug64_monodll | Makefile | メイクファイル |
| │││ | *.o | オブジェクト |
| ││├ lib | *.a | スタティックリンクライブラリ |
| ││|│ | *.dll.a | DLLインポートライブラリ |
| ││|│ | *.dll | ダイナミックリンクライブラリ |
| ││|└ wx | ... | ... |
| ││| ├ config | ... | ... |
| ││| └ include | ||
| ││| └ msw-unicode-3.1 | ||
| ││| └ wx | setup.h | ライブラリ設定インクルード |
| ││| └ msw | rcdefs.h | ウィンドウズリソース定義 |
| ││├ demos | ... | (デモ用ビルドディレクトリ) |
| ││├ samples | ... | (サンプル用ビルドディレクトリ) |
| ││├ tests | ... | (テスト用ビルドディレクトリ) |
| ││└ utils | ... | (ユーティリティ用ビルドディレクトリ) |
| │︙ | ||
| ︙ |
クライアントプロジェクトがビルドしたwxWidgetsを利用するにはコンパイラ/リンカ/リソースコンパイラ探索にMSYS2導入より優先してディレクトリを追加する。さらにプロジェクトはソースコードに<wx/setup.h>をインクルードし、ウィンドウズリソースに<wx/msw/wx.rc>を経由して<wx/msw/rcdefs.h>をインクルードする。これらはincludeとmy_builds\debug64_monodll\include\msw-unicode-3.1の両方に存在するが、configureの生成した後者を使用する。
| 種類 | MSYS2より前置するディレクトリ |
|---|---|
| インクルード | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib\wx\include\msw-unicode-3.1 |
| C:\wxWidgets\wxWidgets-3.1.4\include | |
| ライブラリ | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib |
| リソースインクルード | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib\wx\include\msw-unicode-3.1 |
| C:\wxWidgets\wxWidgets-3.1.4\include |
ダイナミックリンクでビルドするとDLLファイルを...\libに出力する。これを利用するにはDLLをプログラムと同じディレクトリにコピーするか、あるいは実行パス(環境変数PATH)を通す。
| 種類 | MSYS2より前置するディレクトリ |
|---|---|
| 実行パス(PATH) | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib |
デモ用、サンプル用、テスト用、ユーティリティ用ビルドディレクトリおよび各サブディレクトリにはそれぞれMakefileを持ち、各ディレクトリでデフォルトターゲットをメイクすれば各プログラムをビルドする。例えばサンプル用ビルドディレクトリでmakeすれば全サブディレクトリをビルドし、minimalサブディレクトリでmakeすればminimalサンプルアプリケーションだけをビルドする。minimalをビルドしてwxWidgetsが正しくビルドされていることを確認する。
minimalはウィンドウズからも起動できるがラインタイムライブラリもダイナミックリンクなのでそのパスも追加する。
本サイト導入のCode::BlocksはカスタマイズでMSYS2導入wxWidgets利用を前提とする。その代わりにdebug64_monodllビルドを利用する方法を示すが、これはデバッグ情報を持ちwxWidgetsソースコードまでデバッグ追跡できる。説明を目的として動作確認(1)で作成したDesktop1プロジェクトにDebug64_wx31ターゲットを追加する。
Code::Blocksを起動してTestDriveワークスペース(C:\Users\user\MinGW\TestDrive\TestDrive.workspace)してDesktop1プロジェクトをアクティブにする、あるいは直接Desktop1プロジェクト(C:\Users\user\MinGW\TestDrive\Project1\Project1.cbp)を開く。[Project|Properties]の[Project/targets options]ダイアログ[Build targets]ページの[Build targets]のリストボックスでDebug64を選び[Duplicate]ボタンを押す。[Duplicate build target]ダイアログのテキストボックスにDebug64_wx31を入力して[OK]で閉じる。リストボックスでDebug64_wx31が選択されている事を確認して[Build options]を押す。[Project build options]ダイアログが開き、左側ツリービューでDebug64_wx31が選択されている事を確認する。
[Linker settings]ページの[Link libraries]リストボックスでwxWidgets利用のライブラリファイルを置き換える。Desktop1プロジェクトは他のライブラリを利用していないので[Clear]で全消去し、[Add]で開く[Add library]ダイアログで追加する。ライブラリファイルはビルドオプションで異なるが、ここではモノリシック、ダイナミックリンクを選択する。
| ライブラリ |
|---|
| libwx_mswu-3.1.dll.a |
[Search directories]ページの[Compiler]ページ、[Linker]ページ、[Resource compiler]ページ各リストボックスの探索パスを以下に変更する。setup.hへの探索パス名(...\msw-unicode-3.1)もビルドオプションで異なる場合がある。
| ページ | 探索パス |
|---|---|
| [Compiler] | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib\wx\include\msw-unicode-3.1 |
| C:\wxWidgets\wxWidgets-3.1.4\include | |
| [Linker] | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib |
| [Resource compiler] | C:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib\wx\include\msw-unicode-3.1 |
| C:\wxWidgets\wxWidgets-3.1.4\include |
[OK]で[Project build options]ダイアログを閉じる。[OK]で[Project/targets options]ダイアログを閉じる。
[Build|Build]でDebug64_wx31ターゲットをビルドする。
[Build|Select target|Debug64_wx31]でDebug64_wx31ターゲットを選択する。wxWidgetsがダイナミックリンクでビルドされている場合はDLLに実行パスを通す必要があるが、Code::Blocksでの実行はPATHにライブラリディレクトリを自動追加するので省略できる。[Build|Run]で実行する。起動したプログラムの[Help|About](日本語化済みなら恐らく[ヘルプ|このアプリケーションについて])でビルドしたwxWidgetsバージョンを確認する(MSYS2導入と同バージョンだと区別はつかないが)。
debug64_monodllビルドはwxWidgets内部までデバッグ追跡できる。例えばDesktop1でwxWidgetsライブラリwxMessageBox関数の内部フローを確認する。
Desktop1Frame.cppのDesktop1Frame::OnAbout関数wxMessageBoxコール行にテキストカーソルを置いて[Debug|Toggle breakpoint]でブレークポイントを設定する。[Debug|Start / Continue]でデバッガをスタートしてDesktop1を実行させる。起動プログラムで[Help|About](あるいは[ヘルプ|このアプリケーションについて])するとブレークポイントで停止する。[Debug|Step into]するとwxMessageBoxではなくwxStringコンストラクタへ追跡するが、これは実引数処理してから関数コールするためである。[Debug|Step out]でブレークポイントへ戻る。さらに2回[Debug|Step into]と[Debug|Step out]でwxStringコンストラクタを追跡した後、4回目の[Debug|Step into]は_マクロが展開するwxGetTranslationへ追跡するのでもう1回[Debug|Step out]する。5回目の[Debug|Step into]でようやくwxMessageBoxへ追跡し、[Debug|Next line]の繰り返しで内部フローをステップ確認できる。[Debug|Start / Continue]で通常実行を再開する。