cursor 报错 clang ‘stdio.h‘ file not found clang(pp_file_not_found)

今天在使用cursor时,把之前vsode编译正常的工程导入cursor,发现cursor出现错误警报。

经排查出原因:

根本原因不在于“编辑器本身”,而在于两个编辑器背后调用的“语言服务引擎(Language Server)”不同。

VS Code 用了“关系户”插件,自动帮你配好了环境;

而 Cursor 用了“铁面无私”的 clangd,完全按规矩办事,结果发现你项目缺了关键配置文件。

1. 为什么 VS Code 不报错?

  • 插件差异:你在 VS Code 中大概率安装了C/C++ Extension Pack (ms-vscode.cpptools)ESP-IDF Extension

  • 自动拾取环境:微软的 C++ 插件会读取你终端的环境变量(如IDF_PATH),并且会尝试自动解析 ESP-IDF 提供的头文件路径。即使没有compile_commands.json,它也能靠“瞎猜”或者读取c_cpp_properties.json找到stdio.h

  • 警告不严格:微软插件默认不开启“未使用变量”和“未使用头文件”这类静态检查(除非你手动配置),所以你看不到那些黄线警告。

2. 为什么 Cursor 会报错?

  • 插件差异:Cursor 默认推荐或启用了clangd扩展(llvm-vs-code-extensions.vscode-clangd)。

  • 严格依赖编译数据库:clangd 非常严谨,它完全不理会VS Code 的c_cpp_properties.json配置,也不读取PowerShell/bash 里的环境变量。它只认项目根目录下的compile_commands.json(编译数据库)。

  • 找不到路径:因为缺少这个文件,clangd 只能去宿主机的默认系统路径(如/usr/include)找stdio.h,但你的 ESP32-S3 是交叉编译环境,系统路径里根本没有xtensa工具链的头文件,所以报file not found

  • 默认开启 Lint:clangd 默认开启了-Wunused-variable-Wunused-includes等检查,所以它把“未使用”当成警告报告给你了。

解决办法就是:

  1. 在 Cursor 的扩展商店中,禁用clangd扩展。

  2. 启用C/C++扩展(ms-vscode.cpptools)。

  3. 重新加载窗口后,C++ 代码的错误显示就会和 VS Code 完全一致(通常不再报stdio.h找不到,因为 ESP-IDF 插件会自动配置它)。