踩坑案例
场景1:
EPSIDF在VSCODE新建项目的时候,UI界面下方会有一栏让用户选择导入其它components至项目:由此导入的其他的components,是被放在项目根目录下的components文件夹中。以下将项目根目录称为projectroot。
坑点一:
这个components文件夹并不是让你导入ESPIDF目录下的components文件夹的。不要自作聪明(啊对,就是说我自己)将ESPIDF目录下的components导入进来。
ESPIDF/components下的组件会自动被cmake在构建项目的时候搜寻并寻找依赖,而cmake找完彼components文件夹后,就会来到projectroot/components这个文件夹寻找其它非ESPIDF组件。
坑点一总结:
projectroot/components文件夹下是让存放其它非官方自带组件的!不需要将官方组件弄进来!并且这个文件夹下的组件不要引用官方组件中的库!至于为什么,请接着往下看。
场景2:
新建了项目,就想自己编写几个组件用用。一看有个projectroot/components文件夹,就说把组件写这下面吧。然后写了几个.c和.h,以及cmakelists。写的时候,引用了几个ESPIDF/components下的头文件。然后main中再include自己刚写的这几个。再然后,编译不通过并且自写组件的.h内头文件标红。
坑点二:
这里有一个现象:
当main文件夹存在的时候,不能在该文件夹之外的其它组件目录下,编写代码时INCLUDE进EPSIDF自带组件中的库,如“esp_wifi.h”、"freeRTOS.h"等。否则就会出现头文件标红并且提示no such file。而且这个问题还很令人无语,你明明对着那个标红的头文件,ctrl+点击都能点进去,它就是提示no such file,而且build的时候还不给过。这就给人一种,似乎VSCODE在玩你,揣着明白它装糊涂的感觉。 这个问题网上提出的人不多,可能是它有点难触发 (也可能是这个问题有点蠢) 。要是只在main下写自己的.c.h,那没这毛病,如果在projectroot/components写就会出现这种情况。
结合ESPIDF的官方文档,我推断是,ESPIDF默认不支持非main组件以外的组件:在cmakelists.txt不写明的情况下相互引用。
关于main组件的说明:offical:ESP-IDF build system
但说实话,目前还没有啃懂如何在components目录下写组件还能照常引用官方库的。理论上应该是可以的。如有高手,恳请赐教!
坑点二总结:
1、在main目录下写带引用官方库的文件最方便,如果要写的文件很多,可以在main目录下建立文件夹,但是子文件夹中不要带cmakelists,并且在main的cmakelist中将子文件夹下的文件带子文件夹路径加入到SRC字段,并将子文件夹加入INCLUDE字段即可。