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

请检查这段代码,你发现什么问题了吗?
情况是这样的:当我编译完这个用C++移植的LVGL工程后,出现了一个奇怪的现象。在Debug模式下程序运行正常,但在Release模式下,程序总是会在LVGL初始化前卡住。更诡异的是,这个问题还具有一定的随机性,有时会卡住,有时又不会。
这个奇怪的bug困扰了我好几天。今天终于发现,问题出在我定义的一个全局时钟变量上。这个变量在main函数之前就被初始化了。由于LVGL的定时器必须在LVGL初始化完成后才能正常工作,在初始化前操作这个定时器就会导致未定义行为,从而引发这个bug。
Cmake使用心得
项目架构
管理大型项目时,手动输入编译指令显然不现实,因此我选择使用CMake来优化整个编译流程。首先,合理的项目结构至关重要:
对于工具
- 项目根目录下创建src文件夹用于存放项目源代码
- src目录下按功能模块划分,每个模块单独存放源代码
- 如项目引用第三方库,建议在src下创建third_party文件夹存放第三方代码
在项目根目录的CMakeLists.txt文件中,可以通过add_subdirectory指令将第三方库一并编译,避免手动处理各种依赖关系。
项目根目录还应当包含include文件夹:
- 在include下创建与项目同名的子文件夹
- 在该子文件夹中存放模块头文件(如module.hpp)
- 配置CMake的include_directories路径时,采用这种结构可以防止不同库的头文件引用冲突
此外,建议在项目根目录下创建test文件夹:
- 为每个模块编写对应的单元测试
- 可以使用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目录内包含:
- lib文件夹:
- 存放工具库LV toolkit
- eez studio自动生成的文件(位于UI子文件夹内)
- main文件
- CMakeLists文件
- ui文件夹:
- 存放配置好UI界面的MVC架构相关文
- event directory
- 用于初始化UI系统后设置控件的信号和回调函数
项目根目录除了lib文件夹外,还包含log、document等其他辅助目录,这些可根据实际需求进行添加。
注:考虑到文件组织规范,目前没有将所有main文件放在根目录下,而是选择将其保留在src文件

最低0.47元/天 解锁文章
1万+

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



