关于我为什么咕了这么久

这么久没更新了,主要是在做点小项目(

最近又想写个小工具玩玩,C++下的跨平台GUI库最为人所知的就是Qt,但Qt在国内都快成开源刺客了,风评很差,所以我看了下其他选择,我有一位朋友在用wxWidgets库写软件,我就跑去玩了下,还挺不错的,主要是能自绘控件

虽然官网有预编译包,但是我不推荐去下载,这东西编译后会在编译出的exe目录下带一大堆wxWidgets动态库文件,在其他电脑上就算和exe在同个目录下,运行也会报错缺少dll,只适合在配置了wxwidgets环境的电脑上玩

这篇文章就一步步教你如何在win上搭建这个库的静态开发环境,静态编译不需要那一大堆动态库了,只有exe单文件(helloworld编译出来是4MB大小),希望可以帮助你入门这个库(

第一步:下载源码

首先去官网下载源码 https://www.wxwidgets.org/downloads/

注意哦,不要下那个 “Windows Binaries”(预编译库),我们要下 Source Code 我选的是 Windows ZIP,解压到哪里都行,但路径尽量别带中文和空格 2026-02-09T04:40:40.png

我就直接丢在 G:\Documents\wxWidgetsBuild

第二步:编译 wxWidgets 静态库

解压完后,进入 build\msw 目录 因为我用的是VS2022,所以打开 wx_vc17.sln 这个解决方案文件(选vc16也行) 2026-02-09T04:44:50.png

打开后,在顶部的工具栏里,把配置改成 x64 Release(要编译静态库得选这个) 2026-02-09T04:45:39.png

wxWidgets 的 Release 配置默认就是编译静态库的,不需要额外找选项,编译出来就是 .lib,这点挺好的

选好后,在工具栏栏点击 生成 -> 生成解决方案 2026-02-09T04:50:23.png 这个过程会比较慢,可能需要5-15分钟,因为它要编译整个GUI框架 2026-02-09T05:28:50.png

编译完成后,lib\vc_x64_lib目录下就是静态库的文件了 如果看到一堆**.lib**文件,而且没有dll文件,那就说明编译成功了

第三步:创建 CMake 项目

库准备好了,接下来开始写wxwidgets的helloworld 打开 VS2022,创建新项目 再选择 CMake 项目 2026-02-09T04:56:07.png

选这个也方便后面的跨平台,我这里就简单给个在Linux上用g++编译的命令:

g++ main.cpp `wx-config --cxxflags` -o main

给项目起个名字,我这里取wx 2026-02-09T04:59:45.png

第四步:配置 CMakeLists.txt

项目建好后,VS会生成一个默认的 CMakeLists.txt,我们需要修改它,让它能找到我们刚才编译好的 wxWidgets 库 这是我的目录结构: 2026-02-09T05:02:05.png

CMakeLists.txt 改成这样:

cmake_minimum_required(VERSION 3.15)

project(wx)



# 设置 C++ 标准

set(CMAKE_CXX_STANDARD 17)



# 定义 wxWidgets 的根目录 (这里改成你自己的路径,就是你解压wxwidgets源代码的位置)

set(wxWidgets_ROOT_DIR "G:/Documents/wxWidgetsBuild")



# 指定库文件目录 (指向编译好后的静态库)

set(wxWidgets_LIB_DIR "${wxWidgets_ROOT_DIR}/lib/vc_x64_lib")



# 开启静态链接模式

set(wxWidgets_USE_STATIC ON)

# 指定配置为 Unicode Release (mswu)

set(wxWidgets_CONFIGURATION mswu) 



# 查找组件 (core base 是必须的)

find_package(wxWidgets REQUIRED COMPONENTS core base)



# 包含 wx 的配置

include(${wxWidgets_USE_FILE})



# 添加可执行文件 (记得加上 WIN32,不然会有个黑框框)

add_executable(wx WIN32 wx.cpp)



# 链接库

target_link_libraries(wx ${wxWidgets_LIBRARIES})

这里最关键的就是 wxWidgets_ROOT_DIRwxWidgets_LIB_DIR 别填错了

第五步:编写Hello World

配置完了,写个helloworld试试 这里我直接用wxWidgets官方提供的HelloWorld示例代码(稍微精简了一下),贴到 wx.cpp 里:

// wxWidgets "Hello World" Program

// For compilers that support precompilation, includes "wx/wx.h".

#include <wx/wxprec.h>



#ifndef WX_PRECOMP

    #include <wx/wx.h>

#endif



// 定义应用程序类

class MyApp : public wxApp

{

public:

    virtual bool OnInit();

};



// 定义主窗口类

class MyFrame : public wxFrame

{

public:

    MyFrame();



private:

    void OnHello(wxCommandEvent& event);

    void OnExit(wxCommandEvent& event);

    void OnAbout(wxCommandEvent& event);

};



// 告诉 wxWidgets 这是主程序入口

wxIMPLEMENT_APP(MyApp);



// 应用程序初始化

bool MyApp::OnInit()

{

    MyFrame *frame = new MyFrame();

    frame->Show(true);

    return true;

}



// 主窗口构造函数

MyFrame::MyFrame()

    : wxFrame(NULL, wxID_ANY, "Hello World from Nekopara Dev")

{

    wxMenu *menuFile = new wxMenu;

    menuFile->Append(1, "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, 1);

    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!");

}

第六步:运行测试

好了,代码写完了,准备点击运行 等一下,这里有一个坑

因为我们在 CMakeLists.txt 里手动指定了 set(wxWidgets_CONFIGURATION mswu),这代表我们要链接的是 Release 版 的库

但是,VS的CMake项目默认会给你选成Debug配置 如果你在x64 Debug模式下编译,就会出现一大堆不明报错,像这样: 2026-02-09T05:22:43.png

要在顶部的下拉菜单中,将配置切换为x64 Release 2026-02-09T05:23:58.png

切换好之后,点击工具栏的“生成“ -> “全部生成“ 2026-02-09T05:38:18.png 生成的wx.exe已经在out/build/x64-release/wx目录下了 2026-02-09T05:37:30.png 点开exe,窗口弹出来了(虽然界面很简陋),但它是静态链接的,直接把exe给别人也能直接运行 2026-02-09T05:37:58.png

结尾

好了,本篇教程就到这里,希望能帮助到你入门这个库