lvgl cplusplus移植踩坑记录

仅仅个人学习记录,非专业人士,并未系统学习CMake,以下均为从实践中总结,错误之处,万望指出。另,3日连续调试,疲惫不堪,AI润色,万望谅解。

来自C++的下马威

请检查这段代码,你发现什么问题了吗?

情况是这样的:当我编译完这个用C++移植的LVGL工程后,出现了一个奇怪的现象。在Debug模式下程序运行正常,但在Release模式下,程序总是会在LVGL初始化前卡住。更诡异的是,这个问题还具有一定的随机性,有时会卡住,有时又不会。

这个奇怪的bug困扰了我好几天。今天终于发现,问题出在我定义的一个全局时钟变量上。这个变量在main函数之前就被初始化了。由于LVGL的定时器必须在LVGL初始化完成后才能正常工作,在初始化前操作这个定时器就会导致未定义行为,从而引发这个bug。

Cmake使用心得

项目架构

管理大型项目时,手动输入编译指令显然不现实,因此我选择使用CMake来优化整个编译流程。首先,合理的项目结构至关重要:

对于工具

  1. 项目根目录下创建src文件夹用于存放项目源代码
  2. src目录下按功能模块划分,每个模块单独存放源代码
  3. 如项目引用第三方库,建议在src下创建third_party文件夹存放第三方代码

在项目根目录的CMakeLists.txt文件中,可以通过add_subdirectory指令将第三方库一并编译,避免手动处理各种依赖关系。

项目根目录还应当包含include文件夹:

  1. 在include下创建与项目同名的子文件夹
  2. 在该子文件夹中存放模块头文件(如module.hpp)
  3. 配置CMake的include_directories路径时,采用这种结构可以防止不同库的头文件引用冲突

此外,建议在项目根目录下创建test文件夹:

  1. 为每个模块编写对应的单元测试
  2. 可以使用Google Test框架(gtest/gmock)进行测试开发

这种结构化的项目布局能有效提升代码的可维护性和编译效率。

对于一个工具库,可以是这样的::

├─example
│  ├─algorithm
│  │  ├─a_start_find
│  │  ├─kmp_string_find
│  │  └─simulated_annealing
│  ├─chaotic_swing
│  ├─mesh_pbd
│  └─three_body
├─include
│  └─lv_toolkit
├─src
│  ├─core
│  ├─thirdparty
│  │  ├─box2d
│  │  ├─googletest
│  │  ├─lvgl
└─test
    ├─math_test
    └─wgpu_test

        CMakeList.txt(for testing)

CMakeList.txt(main toolkit)
 

对于main,可以是这样的

项目架构说明如下。首先介绍项目引用的库文件结构:

主文件目录下包含一个Src文件夹用于存放源码。Src目录内包含:

  1. lib文件夹:
    • 存放工具库LV toolkit
    • eez studio自动生成的文件(位于UI子文件夹内)
    • main文件
    • CMakeLists文件
  2. ui文件夹:
    • 存放配置好UI界面的MVC架构相关文
  3. event directory
  • 用于初始化UI系统后设置控件的信号和回调函数

项目根目录除了lib文件夹外,还包含log、document等其他辅助目录,这些可根据实际需求进行添加。

注:考虑到文件组织规范,目前没有将所有main文件放在根目录下,而是选择将其保留在src文件

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值