CMake创建wxWidgets桌面应用
环境
- Windows 10
- CMake 3.28
- MinGW 64 8.1
- wxWidgets 3.2.4
wxWidgets
项目结构
wx-demo # 项目目录
--|build # 工程构建目录,存临时生成的文件
--|--|...
--|include # 头文件目录
--|--|...
--|src # 源文件目录
--|--|...
--|external # 引入第三方库文件的所在的文件夹
--|--|wxWidgets
--|--|--|include # wxWidgets头文件
--|--|--|lib # wxWidgets库文件
--CMakeLists.txt # CMake脚本文件
--main.cpp # 程序入口

- Tips
- 头文件和库文件下载后,要解压,然后放到 ./external/wxWidgets 下(你也可以修改CMake配置),结构如上
项目代码
cmake_minimum_required(VERSION 3.17)
project(wx-demo
VERSION 0.1
DESCRIPTION wxWidgets样例
LANGUAGES CXX
)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(EXTERNAL_DIR ${PROJECT_SOURCE_DIR}/external)
include_directories(./include)
include_directories(${EXTERNAL_DIR}/wxWidgets/include)
aux_source_directory(./src SRC)
add_executable(${PROJECT_NAME} main.cpp ${SRC})
# wxWidgets
# 配置wxWidgets库地址,用于find_package
set(wxWidgets_ROOT_DIR ${EXTERNAL_DIR}/wxWidgets)
set(wxWidgets_LIB_DIR ${EXTERNAL_DIR}/wxWidgets/lib/gcc810_x64_dll)
find_package(wxWidgets REQUIRED COMPONENTS net core base)
if(wxWidgets_USE_FILE)
include(${wxWidgets_USE_FILE})
endif()
target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})
#include <wx/wx.h>
class MyApp : public wxApp {
public:
bool OnInit() override;
};
wxIMPLEMENT_APP(MyApp);
class MyFrame : public wxFrame {
public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
};
enum {
ID_Hello = 1
};
bool MyApp::OnInit() {
MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "Hello World") {
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar( menuBar );
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event) {
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event) {
wxMessageBox("This is a wxWidgets Hello World example", "About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event) {
wxLogMessage("Hello world from wxWidgets!");
}
CMake构建
- 进入项目根目录
- 生成构建文件
$ cmake -G "MinGW Makefiles" -B build
- 构建
$ cmake --build build
- 最后会在 ./build 目录下生成可执行文件 wx-demo.exe
- 界面样例如下

- Tips
- 直接运行wx-demo.exe,会报找不到*.dll动态库的问题,可以暂时将wx-demo.exe放到 ./external/wxWidgets/lib/gcc810_x64_dll 下运行,也可以使用CMake命令拷贝库文件到exe程序旁
参考