memleak

导航

ESP-IDF项目添加外部组件

对于我这种硬件做得多,软件做得少的人来说,这些东西还是比较困难,一但有一段时间不用,至少忘掉70%,实在没有软件的天赋,所以碰到问题了,还是写个博客帮助记忆。

现在有多个组件要添加到项目,每个组件都分别占有一个文件夹,想要在主文件中引用组件,需要正确配置CMakeLists,一个ESP项目中至少有两个CMakeList,一个位于项目文件夹下,一个位于main文件夹,如果有外部组件,则每个组件都会有一个CMake,整个项目的结构大致如下:

点击查看代码
project/
|— main/
|  |——— main.c
|  |——— CMakelists.txt
|— components/
|  |——— include/
|  |   |—————— driver.h
|  |———— driver.c
|  |———— CMakelists.txt
|—— CMakelists.txt

这里展示了一个组件时的项目结构,可以把所有组件并列放在components文件夹下,结构比较清晰。这些文件可已自行创建,也可以让ESP-IDF辅助创建,辅助创建会自动生成CMakeLists,更适合新手,这里不展开叙述了。

newcomponent
如果想要自己创建文件夹,就需要自己添加CMake,CMake的知识,又是一大块内容,我也了解不多,就说怎么样能让编译通过,CMake里最核心的就是idf_component_register,相当于告诉编译器哪些文件要被编译,这些文件又依赖哪些文件,这部分内容写对了,编译通过没问题。

Cmake
SRCS这栏都是C文件,没有写入的C文件不会被编译,写了不存在的C文件编译器会报错,INCLUDE_DIR是C文件所依赖的头文件,REQUIRE是外部的依赖项,这些依赖项要么是ESP自带的组件(位于ESP开发包的某个文件夹内),要么不能直接这样引用,需要先有依赖项的文件夹,然后在项目的CMake中注册这个依赖项,然后才能用REQUIRES引用,这个依赖项内同样需要正确的CMake文件。

pcmake
比如我这里的lvgl是自己添加的,没有使用ESP自带的组件管理器,在项目CMakeList中添加set(EXTRA_COMPONET_DIRS <…>),省略部分填你的组件路径,我把lvgl库文件和LCD驱动文件都放在了components文件夹下,这样这两个文件夹的项目都可以作为库使用了,在main文件的CMake里可以直接用REQUIRES引用。

mcmake

maininclude
能在main.c中正常引用无报错,能正常通过编译,只用了144kB,对于ESP32S3的存储空间几乎无影响,当然程序还需要补充,目前只是一个界面,无任何功能。

size

[========]

2026-06-09 10:15:12 星期二
补充一点内容,依赖项尽量分散在单独的文件夹中,比如led.c led.h用一个文件夹装,它的CMakeList里只要完善idf_component_register即可。
当其他文件需要引用这个依赖项时,直接用REQUIRES:

点击查看代码
idf_component_register(SRCS "你的.c文件"
			INCLUDE_DIRS "."
			REQUIRES led)

这样的好处是,每个文件夹的内容都作为一个组件被编译,结构清晰,符合低耦合的编程思想;
还有一种常见写法是使用file(GLOB_RECURSE SRCS "/相对路径/*.c"),或者配合set(简化的路径名 相对路径)把简化的路径写到GLOB_RECURSE后面,这么做会让编译器到这个路径下找这个文件,*.c则会匹配所有.c后缀的文件,然后把所有匹配的文件全丢一锅去编译,这样就不需要给每个组件单独写CMakeList,只需要main文件夹下的CMakeList中用file(GLOB_RECURSE SRCS …),但我个人不喜欢这种写法,因为组件也可能有自己的依赖项,这样写容易出现递归调用,且所有组件的依赖项都要写进主CMake中,容易遗漏,最后导致编译器报错。

posted on 2026-05-28 09:12  行星齿轮  阅读(12)  评论(0)    收藏  举报