020、Zephyr RTOS项目结构解析
Zephyr RTOS 项目结构解析:从一次诡异的链接错误说起
上周调试一块基于STM32H743的工业采集板,Zephyr编译到一半突然报错:undefined reference to 'k_sem_give'。我盯着屏幕看了三分钟——这个API明明在kernel.h里声明了,而且我明明#include了。更诡异的是,同事的电脑上同样的代码能编译通过。
最后发现,问题出在项目结构上:我忘了在CMakeLists.txt里添加zephyr_library()声明,导致内核符号没有被正确链接到我的应用模块。这个坑让我意识到,很多Zephyr新手(包括当年的我)对项目结构的理解停留在“能跑就行”,一旦遇到多模块、多架构的工业项目,就会在链接阶段摔得鼻青脸肿。
今天这篇笔记,我就从项目根目录的CMakeLists.txt开始,把Zephyr项目结构的骨架拆开揉碎。不画图,不列表格,纯靠文字和代码片段把逻辑讲清楚。
根目录CMakeLists.txt:项目的“宪法”
每个Zephyr应用项目,根目录下必须有一个CMakeLists.txt。这不是普通的CMake文件,它定义了整个项目的编译规则、依赖关系和硬件目标。我见过有人把Zephyr当成Arduino来用,直接在main.c里写死所有逻辑,然后抱怨“为什么我的代码不能复用”——这就是没理解项目结构的后果。<
