找不到头文件

主要分为两种:一种是在 Components 内找不到,另一种是在自己文件夹内找不到

情况一(在components文件下添加)

就只在官方的DEMO文件里添加了另外一层文件,就出现这个问题。只多了一层“drv”文件夹,如果不要drv文件夹,把uart移动到components下后编译也是正常的。所以出问题肯定是因为makefile出了问题,无法链接编译到需要的文件夹。

这里使用两种方法进行解决:

第一种:修改工程最外层的makefile和cmakelists.txt连个文件。

添加如下代码

这几句的意思就是让编译器在编译的时候去这几个文件夹下查找需要的文件。
在project.cmake文件里有对目录的解释

大概意思就是让编译器在这个目录下进行查找。(具体语句我也不是很清楚,惭愧)
添加之后编译就可以通过了。

第二种:

编译器之所以链接不到,是因为编译器只能检测到components文件夹的第一层子目录下,就是drv文件夹,该文件夹的子目录不会去链接,因为没有cmakelists.txt文件。
所以第二种方式就是在drv文件夹下创建cmakelists.txt文件.

在该文件夹下添加包含的文件:

这样编译器就能在这里找到drv_uart.c文件了。

PS:如果采用第一种方法,drv下的cmakelists.txt必须删除掉,否则会报错。语句注释掉也不行。
个人建议还是用第一种方法,更正规一点。但是说到底都是编译器没有链接到文件,还是自己学艺不精。
这里要感谢一下同事大佬,感谢文哥。

对了。这个问题并不是很多人说的什么路径问题,我的c_cpp_properties.json文件没有改动。

情况二(在非components文件夹下添加)

比如我们在IDF提供的,hello_world文件夹下添加一个drv文件。这里我们把hello_world文件夹拷贝为test_project工程。在main的同级目录下创建一个drv目录,在该目录下添加文件。此时编译,发现找不到我们的需要的文件。

此时,在main文件夹下的component.mk文件中,添加如下代码:

1
2
COMPONENT_ADD_INCLUDEDIRS := . ../drv
COMPONENT_SRCDIRS := . ../drv

这样就能让编译连链接到drv目录下。此时再make 。不会报错。

报错 No such file or directory

当使用ESP-IDF框架编写项目的时候,往往会在编译的时候碰见这种错误,网上找了很久解决问题的方法,大多数说是路径不对,需要包含进去。

1
2
3
4
5
../main/app_sd.c:15:10: fatal error: esp_vfs_fat.h: No such file or directory
#include "esp_vfs_fat.h"
^~~~~~~~~~~~~~~
compilation terminated.
[96/108] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/app_wifi.c.obj

查找esp_vfs_fot.h文件得知其在fatfs目录下vfs目录下,于是在项目的CMakeList.txt中设置如下

1
2
set(EXTRA_COMPONENT_DIRS 
$ENV{IDF_PATH}/components/fatfs)

编译后依然报错。

进入到fatfs组件中,修改CMakeList.txt,修改component.mk,一通折腾,依然问题如故。

最终发现问题的根源在于,编译的时候此组件的include压根没有进入编译坏境里,那么需要想办法把这个组件添加进require里

最后在项目目录的main目录下发现一个CMakeList.txt文件,里面有个require

1
2
3
4
5
6
7
8
9
10
set(COMPONENT_REQUIRES
esp32-camera
esp-face
nvs_flash
esp_http_server
fb_gfx
mdns
wpa_supplicant
fatfs
)

于是添加fatfs,编译后终于不出错了。


相关链接(侵删)

  1. ESP32-IDF 使用VSCODE添加自己的头文件后无法找到的问题

  2. ESP-IDF框架下的项目编译出现 No such file or directory的解决方法


=================我是分割线=================

欢迎到公众号来唠嗑: