パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
ソースコード(CodeBlocks_wx31_64のビルド)

Code::Blocks20.03をwxWidgetsのバージョン3.1.4でビルドする場合に必要な追加設定とパッチをソースコードと共に示す。

以下の組み合わせについて記述する。

ソフトウェア バージョン
mingw-w64コンパイラ(64ビット) 10.2.0-6
wxWidgetsライブラリ 3.4.1
Code::Blocks 20.03

ダウンロードリンク

アーカイブファイルは二つのディレクトリが欠損している。一つはtools\cbp2makeでCode::Blocksプロジェクトをメイクファイルに変換するスタンドアローンツールで無くても問題は生じない。もう一つはsrc\plugins\contrib\wxContribItems\wxDateTimePickerでCode::Blocksに添付されるコントリビュートwxWidgetsコントロールの一つだが20.03で除外されインストールCode::BlocksのwxSmithコンポーネントパレットにも存在しない。どちらもワークスペース/プロジェクトファイルが参照して警告あるいはエラーを報告する。

追加設定とバッチ

as-isでビルドを試み警告/エラーに一つずつ対処して行く。

cbp2makeプロジェクトの欠損

CodeBlocks_wx31_64.workspaceあるいはContribPlugins_wx31_64.workspaceを開くと[Opening Workspace]ダイアログが開き"1 projects could not be loaded. Pelase see the Log window for details"と警告する。[Logs & others]ペイン[Code::Blocks]ページに以下のエラーが表示されるがその他のプロジェクトは正常に開かれる。この警告は無視する。

...
Unable to open "tools\cbp2make\cbp2make_wx31_64.cbp" during opening workspace "C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\CodeBlocks_wx31_64.workspace"
...

wxPaintEventコンストラクタの問題

CodeBlocks_wx31_64.workspaceを開いてdebug64セットで[Build|Build workspace]すると以下のエラーで停止する。

...
C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\src\main.cpp:2682:22: error: 'wxPaintEvent::wxPaintEvent(wxWindowBase*)' is private within this context
2682 | wxPaintEvent e;
| ^
In file included from C:\wxWidgets\wxWidgets-3.1.4\include/wx/wx.h:24,
from C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\src\app.h:16,
from C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\src\main.cpp:12:
C:\wxWidgets\wxWidgets-3.1.4\include/wx/event.h:2379:14: note: declared private here
2379 | explicit wxPaintEvent(wxWindowBase* window = NULL);
| ^~~~~~~~~~~~
Process terminated with status 1 (3 minute(s), 31 second(s))
Process terminated with status 0 (3 minute(s), 38 second(s))
1 error(s), 23 warning(s) (3 minute(s), 38 second(s))

wxPaintEventコンストラクタがWXBUILDINGマクロ未定義でプライベートになる(C:\wxWidgets\wxWidgets-3.1.4\include\wx\event.h:2373)。

class WXDLLIMPEXP_CORE wxPaintEvent : public wxEvent
{
// This ctor is only intended to be used by wxWidgets itself, so it's
// intentionally declared as private when not building the library itself.
#ifdef WXBUILDING
public:
#endif // WXBUILDING
explicit wxPaintEvent(wxWindowBase* window = NULL);
public:
...
}

Code::Blocks wx3.1.x (64 bit)プロジェクト(src\CodeBlocks_wx31_64.cbp)を選択して[Project|Build options]で[Project build options]ダイアログsrcターゲットの[Compiler settings]ページ[#define]ページにWXBUILDINGを追加する。

wxPGWindowListコンストラクタの問題

引き続き[Build|Build workspace]すると以下のエラーで停止する。

...
106 | wxPGWindowList const list;
| ^~~~
In file included from C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\src\watchesdlg.cpp:31:
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:30:5: note: candidate: 'wxPGWindowList::wxPGWindowList(wxWindow*, wxWindow*)'
30 | wxPGWindowList(wxWindow* primary, wxWindow* secondary = NULL)
| ^~~~~~~~~~~~~~
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:30:5: note: candidate expects 2 arguments, 0 provided
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:27:7: note: candidate: 'constexpr wxPGWindowList::wxPGWindowList(const wxPGWindowList&)'
27 | class wxPGWindowList
| ^~~~~~~~~~~~~~
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:27:7: note: candidate expects 1 argument, 0 provided
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:27:7: note: candidate: 'constexpr wxPGWindowList::wxPGWindowList(wxPGWindowList&&)'
C:\wxWidgets\wxWidgets-3.1.4\include/wx/propgrid/editors.h:27:7: note: candidate expects 1 argument, 0 provided
Process terminated with status 1 (0 minute(s), 8 second(s))
Process terminated with status 0 (0 minute(s), 12 second(s))
1 error(s), 0 warning(s) (0 minute(s), 12 second(s))

wxPGWindowListのデフォルトコンストラクタが失われている(C:\wxWidgets\wxWidgets-3.1.4\include\wx\propgrid\editors.h:27)。

class wxPGWindowList
{
public:
wxPGWindowList(wxWindow* primary, wxWindow* secondary = NULL)
: m_primary(primary)
, m_secondary(secondary)
{
}
...
}

Code::Blocks側にパッチを当てる(src\watchesdlg.cpp:91)。

class cbDummyEditor : public wxPGEditor
{
...
wxPGWindowList CreateControls(cb_unused wxPropertyGrid* propgrid,
cb_unused wxPGProperty* property,
cb_unused const wxPoint& pos,
cb_unused const wxSize& sz) const override
{
//************************************ Kodama modified (Feb.06,2021)
//wxPGWindowList const list;
wxPGWindowList const list{NULL};
//*******************************************************************
return list;
}
...
};

wxDateTimePickerの欠損

引き続き[Build|Build workspace]すると以下のエラーで停止する。

...
-------------- Build: wxDateTimePicker in wxWidgets - Contrib Items wx3.1.x (64 bit) (compiler: GNU GCC Compiler)---------------
WARNING: Can't read file's timestamp: C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\plugins\contrib\wxContribItems\wxDateTimePicker\src\DateTimeCtrl.cpp
WARNING: Can't read file's timestamp: C:\Users\user\MinGW\CB_Work\codeblocks-20.03\src\plugins\contrib\wxContribItems\wxDateTimePicker\src\TimeCtrl.cpp
g++.exe -shared -Wl,--out-implib=..\..\..\devel31_64d\libwxdatetimepicker.a -Wl,--dll -LC:\wxWidgets\wxWidgets-3.1.4\my_builds\debug64_monodll\lib ..\..\..\.objs31_64d\plugins\contrib\wxContribItems\wxDateTimePicker\wxDateTimePicker\src\DateTimeCtrl.o ..\..\..\.objs31_64d\plugins\contrib\wxContribItems\wxDateTimePicker\wxDateTimePicker\src\TimeCtrl.o -o ..\..\..\devel31_64d\wxdatetimepicker.dll -Wl,--enable-auto-import -mthreads -lwx_mswu-3.1.dll
g++.exe: error: ..\..\..\.objs31_64d\plugins\contrib\wxContribItems\wxDateTimePicker\wxDateTimePicker\src\DateTimeCtrl.o: No such file or directory
g++.exe: error: ..\..\..\.objs31_64d\plugins\contrib\wxContribItems\wxDateTimePicker\wxDateTimePicker\src\TimeCtrl.o: No such file or directory
Process terminated with status 1 (3 minute(s), 25 second(s))
2 error(s), 7 warning(s) (3 minute(s), 25 second(s))

wxWidgets - Contrib Items wx3.1.x (64 bit)プロジェクト(plugins\contrib\wxContribItems\wxContribItems_wx31_64.cbp)を選択して[Project|Properties]の[Project/targets options]ダイアログ[Build targets]リストボックスでwxDateTimePickerを[Delete]する。wxSmith - Contrib Items wx3.1.x (64 bit)プロジェクト(plugins\contrib\wxSmithContribItems\wxSmithContribItems_wx31_64.cbp)を選択して[Project|Properties]の[Project/target options]ダイアログ[Build targets]ページ[Build targets]リストボックスwxSmithContribItemsターゲット[Build target files]チェックリストボックスでwxdatetimepicker\wxsTimePickerCtrl.cppとwxdatetimepicker\wxsTimePickerCtrl.hのチェックを外す。[Project|Build options]の[Project build options]ダイアログでwxSmithContribItemsターゲット[Linker settings]ページ[Link libraries]リストボックスのwxdatetimepickerを[Delete]する。

ビルド成功

引き続き[Build|Build workspace]すればビルド成功する。

...
xcopy /Y index.ini ..\..\..\devel31_64d\share\CodeBlocks\docs
cmd /c if not exist ..\..\..\output31_64d\share\CodeBlocks\docs mkdir ..\..\..\output31_64d\share\CodeBlocks\docs
ファイルが見つかりません - index.ini
0 個のファイルをコピーしました
Process terminated with status 4 (10 minute(s), 50 second(s))
0 error(s), 85 warning(s) (10 minute(s), 50 second(s))

最後にindex.iniが見つからないというメッセージが出るがこれは無視できる。次ステップはContribPlugins_wx31_64.workspaceの[Build|Build workspace]だが開く時の警告は残るもののビルドはそのまま成功する。