关于我为什么咕了这么久
这么久没更新了,主要是在做点小项目(
最近又想写个小工具玩玩,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,解压到哪里都行,但路径尽量别带中文和空格
我就直接丢在 G:\Documents\wxWidgetsBuild 了
第二步:编译 wxWidgets 静态库
解压完后,进入 build\msw 目录
因为我用的是VS2022,所以打开 wx_vc17.sln 这个解决方案文件(选vc16也行)
打开后,在顶部的工具栏里,把配置改成 x64 Release(要编译静态库得选这个)
wxWidgets 的 Release 配置默认就是编译静态库的,不需要额外找选项,编译出来就是 .lib,这点挺好的
选好后,在工具栏栏点击 生成 -> 生成解决方案
这个过程会比较慢,可能需要5-15分钟,因为它要编译整个GUI框架
编译完成后,lib\vc_x64_lib目录下就是静态库的文件了
如果看到一堆.lib文件,而且没有dll文件,那就说明编译成功了
第三步:创建 CMake 项目
库准备好了,接下来开始写wxwidgets的helloworld
打开 VS2022,创建新项目
再选择 CMake 项目
选这个也方便后面的跨平台,我这里就简单给个在Linux上用g++编译的命令:
g++ main.cpp `wx-config --cxxflags` -o main给项目起个名字,我这里取wx 
第四步:配置 CMakeLists.txt
项目建好后,VS会生成一个默认的 CMakeLists.txt,我们需要修改它,让它能找到我们刚才编译好的 wxWidgets 库
这是我的目录结构:
把 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_DIR 和 wxWidgets_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模式下编译,就会出现一大堆不明报错,像这样:
要在顶部的下拉菜单中,将配置切换为x64 Release
切换好之后,点击工具栏的“生成“ -> “全部生成“
生成的wx.exe已经在out/build/x64-release/wx目录下了
点开exe,窗口弹出来了(虽然界面很简陋),但它是静态链接的,直接把exe给别人也能直接运行
结尾
好了,本篇教程就到这里,希望能帮助到你入门这个库



































































































































