基于wxWidgets源码构建开发库,使用CMake构建wxWidgets应用程序并结合VSCode进行代码编辑,应该是wxWidgets应用程序开发比较主流的方式。这种方式给开发者带来了极大的灵活性和自由度,可以基于对各个环节细致的参数调整来适应丰富多样的应用场景。值得我们仔细、深入且持续的探索。
一、下载源码
下载项目源码,官方网站推荐使用git工具从GitHub上下载。由于wxWidgets引用了其他开源项目,因此,在clone时,需要指定--recurse-submodules标志。
$ git clone --recurse-submodules https://github.com/wxWidgets/wxWidgets.git
亦可登录wxWidgets官网

选择Source for Linux, macOS, etc
二、编译wxWidgets
CMake允许使用您偏好的构建系统在各种平台上构建wxWidgets。本教程编译平台为MacOS,Linux和Windows上的操作与此类似
(一)基本步骤
进入源码目录
cd ./wxWidgets
创建build文件夹并进入
mkdir build
cd build
执行cmake生成Makefile
cmake ..
make -j8
sudo make install
即完成wxWidgets开发库的安装。
(二)编译选项
在使用cmake生成Makefile时,可以使用宏定义编译行为。
| 选项名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| wxBUILD_SHARED | BOOL | ON | ON:构建动态库;OFF:构建静态库 |
| wxBUILD_TESTS | STRING | OFF | 生成测试程序:值为:CONSOLE_ONLY, ALL 或 OFF |
| wxBUILD_SAMPLES | STRING | OFF | 构建样例程序。值为:SOME, ALL 或 OFF |
| wxBUILD_DEMOS | BOOL | OFF | 构建示例demos |
| wxUSE_GUI | BOOL | ON | 构建UI库 |
| wxBUILD_COMPATIBILITY | STRING | 3.0 | 兼容2.8, 3.0 or 3.1的API |
| wxBUILD_PRECOMP | BOOL | ON | 使用预定义头文件 |
| wxBUILD_MONOLITHIC | BOOL | OFF | ON:构建单体库;OFF:生成分立库 |
假设您希望开发的应用程序可部署过程中需要动态依赖wxWidgets库,则可在编译时生成静态库,使用如下命令构建wxWidgets
cmake -DwxBUILD_SHARED =OFF ..
有时为了减少应用程序的体积,需要动态依赖wxWidgets库,但又不希望动态库数量太多,可以构建单体wxWidgets动态库,构建命令如下:
cmake -DwxBUILD_SHARED=ON -DwxBUILD_MONOLITHIC=ON ..
如果你将开发的程序将运行在无桌面系统的服务器中,可以关闭GUI功能。
cmake -DwxUSE_GUI=OFF ..
如果好奇或研究的需要,您可能对wxWidgets提供的样例很感兴趣,可以在构建库的同时生成样例的可执行程序
cmake -DwxBUILD_SAMPLES =ON ..
三、CMake构建应用程序
如果使用CMake构建wxWidgets应用程序,有如下几种方式引用wxWidgets库
1.使用find_package()函数来查找已安装的、二进制格式的或编译好的wxWidgets版本
2.作为子目录使用。
3.CMake的xternalProject module模块。
(一)find_package方式
本文采用第一种方式。
创建工程目录simple,及示例代码如下:

示例代码如下:
1.头文件
#include<wx/wxprec.h>
#ifndef WX_PRECOMP
#include<wx/wx.h>
#endif
class MyApp : public wxAppConsole{
public:
virtual bool OnInit();
virtual int OnRun();
};
wxDECLARE_APP(MyApp);
2.实现文件
#include<myapp.h>
#include<iostream>
wxIMPLEMENT_APP_CONSOLE(MyApp);
bool MyApp::OnInit(){
std::cout<<"OnInit()"<<std::endl;
return true;
}
int MyApp::OnRun(){
std::cout<<"on run \n";
return 0;
}
3.项目工程文件CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(wxtest )
include_directories(./inc)
aux_source_directory(./src SRC)
find_package(wxWidgets REQUIRED COMPONENTS net core base)
if(wxWidgets_USE_FILE) # not defined in CONFIG mode
include(${wxWidgets_USE_FILE})
endif()
add_executable(myapp ${SRC})
target_link_libraries(myapp ${wxWidgets_LIBRARIES})
编译并运行程序
cmake -B build
cmake --build build
(二)使用子目录方式
您可以将wxWidgets作为应用程序构建树中的一个子目录来使用,例如,将其作为Git子模块。这样,wxWidgets库就会成为您应用程序构建过程的一部分。
你的CMakeLists.txt文件看起来会像这样
...
add_subdirectory(libs/wxWidgets)
add_executable(myapp myapp.cpp)
target_link_libraries(myapp wx::net wx::core wx::base)
您可以在使用add_subdirectory()之前,通过在命令行上定义它们(例如使用-DwxBUILD_SHARED=OFF)或者通过添加来预定义构建选项
set(wxBUILD_SHARED OFF)
至CMakeLists.txt以使用静态的wxWidgets库。
(三)XRC集成
另一种可能遇到的问题是XRC的使用,需要在CMakeLists.txt中进行配置,以简化XRC的集成。
要将XRC资源嵌入到您的应用程序中,您需要定义一个自定义命令来使用wxrc生成源文件。当使用已安装的wxWidgets版本时,您可以直接使用wxrc,但当从子目录中使用wxWidgets时,您需要确保它已先构建好,并使用正确的路径,例如:
# resource.xrc为项目的XRC文件
set(xrc_files ${CMAKE_CURRENT_SOURCE_DIR}/resource.xrc)
# 在构建目录(如build)中生成对应cpp文件.
set(resource_cpp ${CMAKE_CURRENT_BINARY_DIR}/resource.cpp)
# 使用wxWidgets提供的工具"wxrc".
set(wxrc $<TARGET_FILE:wxrc>)
add_custom_command(
OUTPUT ${resource_cpp} # OUTPUT参数用于指定自定义命令生成的输出文件或目标
# 这些文件会成为目标的依赖项
COMMAND ${wxrc} -c -o ${resource_cpp} ${xrc_files}
DEPENDS ${xrc_files}
DEPENDS wxrc
COMMENT "Compiling XRC resources"
)
target_sources(myapp PRIVATE ${resource_cpp})
四、示例代码
本文示例工程已上传至CSDN资源,点击链接CMake集成wxWidgets开发的示例工程项目即可下载。
五、结论
基于wxWidgets源码构建开发库,使用CMake构建wxWidgets应用程序并结合VSCode进行代码编辑,应该是wxWidgets应用程序开发比较主流的方式。这种方式给开发者带来了极大的灵活性和自由度,可以基于对各个环节细致的参数调整来适应各类不同的应用场景。值得仔细、深入且持续的探索。
611

被折叠的 条评论
为什么被折叠?



