【wxWidgets教程】入门:CMake工程配置解析

本文在《C++跨平台GUI框架wxWidgets:CMake源码编译与构建》在基础上,进一步拓展在CMake中使用wxWidgets的细节问题。wxWidgets教程完整目录

一、创建示例项目

本文使用的示例项目来自《C++跨平台GUI框架wxWidgets:CMake源码编译与构建》3.1节“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})
 

4. 编译并运行程序

cmake -B build
cmake --build build

二、CMakeLists.txt解析

在CMakeLists.txt中,有关wxWidgets的配置为:

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 ...)
target_link_libraries(myapp ${wxWidgets_LIBRARIES})

(一)find_package指令

find_package用于查找是否安装了wxWidgets并选择默认配置使用。wxWidgets是一个CMake模块化库。该指令的语法格式为:

find_package(wxWidgets COMPONENTS core base ... OPTIONAL_COMPONENTS net ...)

该指令将引入以下变量:

wxWidgets_FOUND 如果找到wxWidgets,则设置为TRUE
wxWidgets_INCLUDE_DIRSWIN32的包含目录,即,查找"wx/wx.h"和
"wx/setup.h"的位置;对于Unix可能为空。
wxWidgets_LIBRARIES wxWidgets库的路径
wxWidgets_LIBRARY_DIRS编译时链接目录,对于UNIX上的
rpath很有用。通常在WIN32环境中为空字符串。
wxWidgets_DEFINITIONS包含编译/链接WX所需的定义,例如:WXUSINGDLL        
wxWidgets_DEFINITIONS_DEBUG包含编译/链接WX调试版本所需的定义,例如:WXDEBUG
wxWidgets_CXX_FLAGSUnix的包含目录和编译器标志;在WIN32上为空。本质上是
"wx-config --cxxflags"
wxWidgets_USE_FILE 方便的包含文件

wxWidgets支持库(或可选库)包括:gl,core,base,net,webview等。

对于单体wxWidgets编译版,库的值只能是:mono

特别需要注意的地方是,在MinGW中,库的顺序很重要,不能更改。正确的顺序如下所示:

find_package(wxWidgets REQUIRED net gl core base)
include(${wxWidgets_USE_FILE}) 
target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})

(二)包含配置文件

if(wxWidgets_FOUND) #或 if(wxWidgets_USE_FILE)
    include(${wxWidgets_USE_FILE})  
endif()

${wxWidgets_USE_FILE}指UsewxWidgets.cmake文件。该文件会存在安装wxWidgets时部署在本机上。但found_package指令会首先检查当前目录是否存在同名文件,如存在,则加载该文件,否则,使用wxWidgets库中默认的同名文件。

wxWidgets中默认的UsewxWidgets.cmake文件定义如下:

if   (wxWidgets_FOUND)
  if   (wxWidgets_INCLUDE_DIRS)
    if(wxWidgets_INCLUDE_DIRS_NO_SYSTEM)
      include_directories(${wxWidgets_INCLUDE_DIRS})
    else()
      include_directories(SYSTEM ${wxWidgets_INCLUDE_DIRS})
    endif()
  endif()

  if   (wxWidgets_LIBRARY_DIRS)
    link_directories(${wxWidgets_LIBRARY_DIRS})
  endif()

  if   (wxWidgets_DEFINITIONS)
    set_property(DIRECTORY APPEND
      PROPERTY COMPILE_DEFINITIONS ${wxWidgets_DEFINITIONS})
  endif()

  if   (wxWidgets_DEFINITIONS_DEBUG)
    set_property(DIRECTORY APPEND
      PROPERTY COMPILE_DEFINITIONS_DEBUG ${wxWidgets_DEFINITIONS_DEBUG})
  endif()

  if   (wxWidgets_CXX_FLAGS)
    # Flags are expected to be a string here, not a list.
    string(REPLACE ";" " " wxWidgets_CXX_FLAGS_str "${wxWidgets_CXX_FLAGS}")
    string(APPEND CMAKE_CXX_FLAGS " ${wxWidgets_CXX_FLAGS_str}")
    unset(wxWidgets_CXX_FLAGS_str)
  endif()
else ()
  message("wxWidgets requested but not found.")
endif()

该文件引入了wxWidgets头文件目录、库文件目录、相关宏定义、编译标志等信息。这些信息将会直接影响应用程序的编译。

(三)依赖库设置

对于每个可执行文件/库目标,设置wxWidgets库依赖:

# 对于每个依赖的可执行文件/库目标:
target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})

${wxWidgets_LIBRARIES}在UsewxWidgets.cmake中定义,库所在目录由UsewxWidgets.cmake指定。

三、总结

CMake 是一个跨平台的自动化构建系统,主要用于管理软件的构建过程。它不直接构建软件,而是生成标准的构建文件(如 Makefile、Visual Studio 项目文件等),然后由相应的原生构建工具(如 make、ninja、MSBuild)来执行实际的编译和链接。

然而,对外部库在CMake中的使用,通常没有统一的标准。本文分析了wxWidgets在CMake中的配置方法,分析的主要依据是wxWidgets安装过程中在本机部署的FindwxWidgets.cmake和UsewxWidgets.cmake文件。

笔者更想强调的时,当需要在CMake工程中集成一个新的C++库时,一方面可以通过官方的教程来查看集成方式,另一方面则可分析库的FindXXX.cmake文件来获得更确切的结论。

内容概要:本文详细介绍了一种基于节点不连续伽辽金方法(Discontinuous Galerkin Method)在求解线性和非线性平流方程中的一维数值实现方案,并提供了完整的MATLAB代码实现。该方法在处理偏微分方程特别是具有间断解或高梯度特征的问题时展现出优异的稳定性和精度。文中系统阐述了算法的核心原理、空间离散化策略、时间推进机制以及边界条件的处理方式,通过具体编程实例展示如何在MATLAB环境中实现该数值方法,并辅以典型算例验证其有效性和可靠性。此外,文章还强调科研工作中“借力”与创新思维的重要性,鼓励研究者在夯实理论基础的同时勇于探索新思路。; 适合人群:具备偏微分方程数值解法基础知识、熟悉MATLAB编程,从事计算数学、流体力学、物理建模及相关领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:① 学习并掌握节点不连续伽辽金方法的基本理论与实现流程;② 利用所提供的MATLAB代码开展线性和非线性平流方程的数值模拟实验;③ 将该方法作为基础算法应用于高分辨率数值模拟、守恒律方程求解等科研项目中的扩展与改进; 阅读建议:建议读者结合经典数值分析教材深入理解DG方法的数学背景,逐段调试并运行所附MATLAB代码,通过调整初始条件、网格划分和时间步长等方式观察算法表现,从而深化对数值稳定性与计算精度之间平衡关系的理解。
内容概要:本文档聚焦于【博士论文复现】光伏并网逆变器序阻抗建模、扫频辨识与弱电网交互稳定性分析,提供了完整的Matlab代码与Simulink仿真实现方案。内容涵盖基于谐波线性化的并网VSG逆变器正负序阻抗建模、锁相环与电流环的小信号建模、扫频法辨识系统阻抗、奈奎斯特稳定性判据的应用,以及在弱电网条件下逆变器与电网交互稳定性的仿真验证全过程。通过理论推导与仿真实践相结合,帮助读者掌握新能源并网系统稳定性分析的核心技术与工程实现方法。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink环境,从事新能源发电、并网控制或电力系统稳定性研究的研究生、科研人员及工程师。; 使用场景及目标:① 复现博士论文中关于光伏并网逆变器阻抗建模与稳定性分析的关键实验;② 学习并掌握扫频法(Frequency Scan)在实际系统中的应用技巧;③ 利用提供的模型进行弱电网下并网系统稳定性的仿真研究与故障机理分析;④ 作为相关课题研究或毕业设计的技术参考与代码基础。; 阅读建议:此资源以博士论文级别的科研内容为核心,不仅提供可运行的代码,更强调理论与实践的紧密结合。建议使用者首先梳理文档中的理论框架,再逐步运行和调试仿真模型,重点关注扫频激励信号的设计、阻抗数据的提取与稳定性判据的判断逻辑,从而深刻理解并网逆变器在复杂电网环境下的动态交互行为。
(一)前端报名页面功能 自定义表单生成 后台拖拽式配置报名表单,按需增删字段,设置字段必填 / 选填、字段提示文字、输入长度限制;支持多表单模板,可搭建招生报名、活动签到、求职投递、团购预约多套独立报名页。 数据格式强校验 原生 PHP 校验手机号、身份证、邮箱、数字格式,非法输入实时拦截,避免脏数据入库;搭配图形验证码,防止机器批量刷报名。 文件上传附件 支持图片、PDF、Word 等材料上传(简历、证件、报名表),后台统一管理附件,限制上传大小与文件类型。 自动回执提示 用户提交成功后展示自定义成功文案,支持弹窗 / 跳转页面两种提示;可设置自动展示报名编号(内置唯一 ID 生成脚本)。 兼容拦截工具 集成广告拦截检测脚本,访客开启广告拦截时友好提示关闭,保证表单正常提交;兼容代理访问用户,后台可查看访客代理 IP 记录。 (二)后台管理核心功能 账号密码安全防护 后台登录页采用 PHP 简易密码保护脚本,独立管理密码,支持多管理员账号、分级权限(普通查看 / 完整编辑 / 数据删除)。 实时报名数据管理 列表分页展示所有报名记录,支持按姓名、电话、报名时间、表单字段模糊搜索; 支持单条编辑、删除、标记已联系 / 已核销 / 无效报名; 批量操作:批量导出 Excel、批量删除、批量修改状态。 在线实时统计 内置在线访客统计脚本,后台首页实时查看当前访问报名页在线人数;自动生成报名数据统计图(每日报名量、字段占比)。 数据导出与打印 一键导出全部 / 筛选后的报名数据为 Excel 文件,包含所有填写字段、上传附件链接、提交时间、访客 IP;支持打印纸质签到表。 消息自动通知 管理员通知:用户提交报名后,自动发送短信 / 邮件提醒管理员有新报名; 用户回执:提交成功自动给用户手机 / 邮箱发送报名凭证、报名编号。 防刷限流配置 后台可自定义限制:同一 IP X 分钟内仅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万法若空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值