C++跨平台GUI框架wxWidgets:CMake源码编译与构建

基于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应用程序开发比较主流的方式。这种方式给开发者带来了极大的灵活性和自由度,可以基于对各个环节细致的参数调整来适应各类不同的应用场景。值得仔细、深入且持续的探索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值