wxWidgets 環境搭建
在wxWidgets 官網下載頁面點擊Download Windows Binaries
選擇TDM-GCC 10.3
和MinGW-w64 8.1
下的頭文件和開發包進行下載。這兒我們會用兩種 gcc 編譯器進行對比,所以下載 2 個種編譯器對應的庫文件。正常只需根據自己安裝的編譯器下載對應的 1 種庫文件即可。
將下好的文件解壓到 wxWidgets 的根目錄(這兒以D:\wxWidgets
為例),解壓后的目錄結構如下:
/d/wxWidgets
├── wxMSW-3.2.4_gcc1030TDM_Dev TDM-GCC 10.3 編譯32位應用程序對應的庫頭文件的dll文件
│ ├── include
│ │ ├── msvc
│ │ └── wx
│ └── lib
│ └── gcc1030TDM_dll
│ ├── mswu
│ └── mswud
├── wxMSW-3.2.4_gcc1030TDM_x64_Dev TDM-GCC 10.3 編譯64位應用程序對應的庫頭文件的dll文件
│ ├── include
│ │ ├── msvc
│ │ └── wx
│ └── lib
│ └── gcc1030TDM_x64_dll
│ ├── mswu
│ └── mswud
├── wxMSW-3.2.4_gcc810_Dev MinGW-w64 8.1.0 編譯32位應用程序對應的庫頭文件的dll文件
│ ├── include
│ │ ├── msvc
│ │ └── wx
│ └── lib
│ └── gcc810_dll
│ ├── mswu
│ └── mswud
└── wxMSW-3.2.4_gcc810_x64_Dev MinGW-w64 8.1.0 編譯64位應用程序對應的庫頭文件的dll文件├── include│ ├── msvc│ └── wx└── lib└── gcc810_x64_dll├── mswu└── mswud
注:include 目錄下的msvc是給 VC 編譯器使用的,現在我們使用 gcc 編譯器。所以不應將 msvc 目錄加入頭文件搜索路徑中去。
將所有 lib/*_dll 目錄添加到環境變量 Path 中
GCC 環境搭建
MinGW-w64 8.1.0
從MinGW-w64 下載頁選擇下載以下文件:
i686-win32-sjlj
下載后的文件為:i686-8.1.0-release-win32-sjlj-rt_v6-rev0
32 位程序對應的編譯器x86_64-win32-seh
下載后的文件為:x86_64-8.1.0-release-win32-seh-rt_v6-rev0
64 位程序對應的編譯器x86_64-posix-sjlj
下載后的文件為:x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0
(僅為后面實驗用)
將下載的文件解壓到 MinGW-w64 安裝目錄(這兒以D:\MinGW-w64
為例),目錄結構如下:
/d/mingw-w64
├── i686-8.1.0-release-win32-sjlj-rt_v6-rev0
│ └── mingw32
│ ├── bin
│ ├── etc
│ ├── i686-w64-mingw32
│ ├── include
│ ├── lib
│ ├── libexec
│ ├── licenses
│ ├── opt
│ └── share
├── x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0
│ └── mingw64
│ ├── bin
│ ├── etc
│ ├── include
│ ├── lib
│ ├── libexec
│ ├── licenses
│ ├── opt
│ ├── share
│ └── x86_64-w64-mingw32
└── x86_64-8.1.0-release-win32-seh-rt_v6-rev0└── mingw64├── bin├── etc├── include├── lib├── libexec├── licenses├── opt├── share└── x86_64-w64-mingw32
將所有的 bin 目錄添加到環境變量 path 中
TDM-GCC 10.3
- 從64 位 TDM-GCC 下載頁面下載
tdm64-gcc-10.3.0-2.exe
作為 64 位程序的編譯器 - 從32 位 TDM-GCC 下載頁面下載
tdm-gcc-10.3.0.exe
作為 32 位程序的編譯器
將下載的兩個文件點擊安裝到 TDM-GCC 根目錄(這兒以D:\TDM-GCC
為例)安裝后目錄結構如下:
/d/Tdm-gcc
├── TDM-GCC-32
│ ├── __installer
│ ├── bin
│ ├── gdb32
│ ├── include
│ ├── lib
│ ├── libexec
│ ├── mingw32
│ ├── share
│ └── var
└── TDM-GCC-64├── __installer├── bin├── gdb64├── include├── lib├── libexec├── share└── x86_64-w64-mingw32
創建 HelloWorld 工程
源文件
創建一個工程目錄,并在該目錄下創建HelloWorld.cpp
文件
// Start of wxWidgets "Hello World" Program
#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!");
}
VsCode 配置文件
配置 wxWidgets 目錄
在工程文件夾的.vscode
目錄下的settings.json
文件中添以下配置:
{"wxWidgets_gcc810": {// MinGW-w64 編譯32位程序時的庫文件和頭文件"include_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_Dev\\include","setup_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_Dev\\lib\\gcc810_dll\\mswu","lib_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_Dev\\lib\\gcc810_dll"},"wxWidgets_gcc810_x64": {// MinGW-w64 編譯64位程序時的庫文件和頭文件"include_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_x64_Dev\\include","setup_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_x64_Dev\\lib\\gcc810_x64_dll\\mswu","lib_path": "D:\\wxWidgets\\wxMSW-3.2.4_gcc810_x64_Dev\\lib\\gcc810_x64_dll"},"wxWidgets_tdmgcc": {// TDM-GCC 編譯32位程序時的庫文件和頭文件"include_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_Dev/include","setup_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_Dev/lib/gcc1030TDM_dll/mswu","lib_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_Dev/lib/gcc1030TDM_dll"},"wxWidgets_tdmgcc_x64": {// TDM-GCC 編譯64位程序時的庫文件和頭文件"include_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_x64_Dev/include","setup_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_x64_Dev/lib/gcc1030TDM_x64_dll/mswu","lib_path": "D:/wxWidgets/wxMSW-3.2.4_gcc1030TDM_x64_Dev/lib/gcc1030TDM_x64_dll"}
}
配置 C/C++ 環境
在工程文件夾的.vscode
目錄下的c_cpp_properties.json
文件中添以下配置:
{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","${config:wxWidgets_gcc810.include_path}","${config:wxWidgets_gcc810.setup_path}"],"defines": ["_DEBUG", "UNICODE", "_UNICODE"],"compilerPath": "D:/MinGW-W64/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/g++.exe","cStandard": "c17","cppStandard": "gnu++14","intelliSenseMode": "windows-gcc-x86"}],"version": 4
}
主要添了頭文件路 ${config:wxWidgets_gcc810.include_path}
對應 settings.json 文件下的 wxWidgets_gcc810 配置下的 include_path 對應的路徑,
${config:wxWidgets_gcc810.setup_path}
對應 settings.json 文件下的 wxWidgets_gcc810 配置下的 setup_path 對應的路徑
配置編譯任務
在工程目錄的.vscode
文件夾下添加task.json
文件:
{"version": "2.0.0","tasks": [{"type": "cppbuild","label": "MinGW-W64-W64 32位編譯器生成32位應用程序","command": "D:/MinGW-W64/i686-8.1.0-release-win32-sjlj-rt_v6-rev0/mingw32/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe","-s","-I${config:wxWidgets_gcc810.include_path}","-I${config:wxWidgets_gcc810.setup_path}","-mwindows","-L${config:wxWidgets_gcc810.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/MinGW-W64/i686-8.1.0-release-win32-sjlj-rt_v6-rev0/mingw32/bin/"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/MinGW-W64/i686-8.1.0-release-win32-sjlj-rt_v6-rev0/mingw32/bin/g++.exe"},{"type": "cppbuild","label": "MinGW-W64-W64 64位編譯器生成64位應用程序","command": "D:/MinGW-W64/x86_64-8.1.0-release-win32-seh-rt_v6-rev0/mingw64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}_x64.exe","-s","-I${config:wxWidgets_gcc810_x64.include_path}","-I${config:wxWidgets_gcc810_x64.setup_path}","-mwindows","-L${config:wxWidgets_gcc810_x64.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/MinGW-W64/x86_64-8.1.0-release-win32-seh-rt_v6-rev0/mingw64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/MinGW-W64/x86_64-8.1.0-release-win32-seh-rt_v6-rev0/mingw64/bin/g++.exe"},{"type": "cppbuild","label": "MinGW-W64-W64 64位編譯器生成32位應用程序","command": "D:/MinGW-W64/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}_x64_32.exe","-m32","-s","-I${config:wxWidgets_gcc810.include_path}","-I${config:wxWidgets_gcc810.setup_path}","-mwindows","-L${config:wxWidgets_gcc810.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/MinGW-W64/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/MinGW-W64/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/g++.exe"},{"type": "cppbuild","label": "TDM-GCC 32位編譯器生成32位應用程序","command": "D:/TDM-GCC/TDM-GCC-32/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}_tdm.exe","-s","-I${config:wxWidgets_tdmgcc.include_path}","-I${config:wxWidgets_tdmgcc.setup_path}","-mwindows","-L${config:wxWidgets_tdmgcc.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/TDM-GCC/TDM-GCC-32/bin/"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/TDM-GCC/TDM-GCC-32/bin/g++.exe"},{"type": "cppbuild","label": "TDM-GCC 64位編譯器生成64位應用程序","command": "D:/TDM-GCC/TDM-GCC-64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}_tdm_x64.exe","-s","-I${config:wxWidgets_tdmgcc_x64.include_path}","-I${config:wxWidgets_tdmgcc_x64.setup_path}","-mwindows","-L${config:wxWidgets_tdmgcc_x64.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/TDM-GCC/TDM-GCC-64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/TDM-GCC/TDM-GCC-64/bin/g++.exe"},{"type": "cppbuild","label": "TDM-GCC 64位編譯器生成32位應用程序","command": "D:/TDM-GCC/TDM-GCC-64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}_tdm_x64_32.exe","-m32","-s","-I${config:wxWidgets_tdmgcc.include_path}","-I${config:wxWidgets_tdmgcc.setup_path}","-mwindows","-L${config:wxWidgets_tdmgcc.lib_path}","-lwxbase32u","-lwxmsw32u_core"],"options": {"cwd": "D:/TDM-GCC/TDM-GCC-64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "編譯器: D:/TDM-GCC/TDM-GCC-64/bin/g++.exe"}]
}
共添加了 6 個編譯任務,分別對應 2 種編譯器,每種編譯器對應的生成 3 個可以行文件
- 帶 x64 的表示 64 位應用程序
- 帶 x64_32 表示由 64 位編譯器生成的 32 位程序
- 帶 tdm 的表示由 TDM-GCC 編譯生成
VsCode 打開 HelloWorld.cpp 時按 F1 輸入run task
選擇對應的任務生成對應的應用程序
生成的應用程序對比
- tdm-gcc 生成的應用程序比 MinGW-w64 生成的應用程序略大
- MinGW-w64 比 tdm-gcc 生成的應用程序 多依賴
libgcc_s_sjlj-1.dll
和libstdc++-6.dll
僅對比 32 位程序 - tdm-gcc 可以用 64 位編譯器加
-m32
參數和回wxWidgets 32位庫文件
生成32位應用程序,
但因為wxWidgets gcc810庫文件32位和64位使用了不同的異常處理,x86_64-8.1.0-release-win32-seh-rt_v6-rev0
是不能通過添加-m32
參數來生成32位應用的,
可以使用x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0
添加-m32
參數和32位庫文件來生成32位應用程序
個人覺得使用TDM-GCC省事些,而且可以只下載64位的TDM-GCC編譯器來生成32位或64位的程序