本帖最后由 SmileYik 于 2023-11-24 18:35 编辑
本帖最后由 SmileYik 于 2023-11-21 00:38 编辑
记一次在AiPi-Open-Kits项目中使用Clangd进行代码补全和阅读时出现的问题
前言
不知道大家会不会注意到一件事情,就是自己用vscode或者其他编辑工具,如atom、kate等打开项目会出现头文件不存在或者是不能正确显示建议和自动补全,还有时候会出现各种莫名其妙的语法提示错误,这有可能是Clangd出了问题。(不知道你们会不会反正我是遇到了)
编译能过去但是编辑器内显示的情况:
解决方案
方案1
如果你不使用CMake管理项目,或者不使用bear等工具其他生成 compile_commands.json
文件的方式,解决方法很简单,在项目文件夹里创建一个 .clangd
文件,在这文件里写入如下内容后保存,重启LSP服务器即可(记住将 /path/to/
改为电脑上实际状况下的地址)。在VSCode中重启LSP的方法可以是按下 CTRL+SHIFT+P
,在弹出输入框中输入 clangd restart
后找到重启字样的选中按下回车即可。
CompileFlags:
Add:
- "-I/path/to/aithinker/Project_basic/components/wifi"
- "-I/path/to/aithinker/Project_basic/config"
- "-I/path/to/aithinker/Project_basic/main"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/bsp/board/bl616dk/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/crypto/mbedtls/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/crypto/mbedtls/mbedtls/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/crypto/mbedtls/port"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/crypto/mbedtls/port/platform"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/libc/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/libc/newlib/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/mm/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/mm/tlsf/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/net/lwip/lwip/src/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/net/lwip/lwip/src/include/compat/posix"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/net/lwip/lwip/src/include/lwip/apps"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/net/lwip/lwip/system"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/net/lwip/lwip_apps/dhcpd/."
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/os/freertos/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/os/freertos/portable/GCC/RISC-V/common"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/os/freertos/portable/GCC/RISC-V/common/chip_specific_extensions/RV32I_CLINT_no_extensions"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/os/freertos/posix/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/bflb_block_pool"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/bflb_timestamp"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/getopt"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/log"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/log/bflog"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/utils/ring_buffer"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/wireless/wifi6/bl6_os_adapter/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/components/wireless/wifi6/inc"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/config/bl616"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/include/arch"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/include/arch/risc-v/t-head"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/include/arch/risc-v/t-head/Core/Include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/lhal/src/flash"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/rfparam/Inc"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/soc/bl616/rf/inc"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/soc/bl616/std/include"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/drivers/soc/bl616/std/include/hardware"
- "-I/path/to/git/aithinker_Ai-M6X_SDK/toolchain/bin/../riscv64-unknown-elf/include"
以上内容可能会头文件有覆盖不够全面的问题,可以自己按需寻找其他头文件目录加入以上配置文件即可(记得重启LSP服务器)。效果如下,基本上能正常使用语法提示和补全,不存在完全用不了的问题:
方案2
上一个方案是不依靠 compile_commands.json
文件,而这个方案则是依靠此文件,同时此方案应该能完整解决莫名其妙报错问题。(电脑因人而异,我自己用起来目前没异常情况)
在拥有 compile_commands.json
且无 .clangd
文件情况下,仅简单语法提示,但是不能显示函数功能等,具体如图:
同时当鼠标悬浮到某一单词文本上,LSP服务器就会报错,具体也如下:
此时查阅issue得到相同问题(具体为# clangd invalid AST #1582)
解决方案为在项目根目录创建一个 .clangd
(或Clangd的全局配置文件内),在其中加入如下内容:
CompileFlags:
Remove:
- '-march=*'
- '-fstrict-volatile-bitfields'
注意:之所以要移除 -fstrict-volatile-bitfields
是因为对于clangd来说 -fstrict-volatile-bitfields
参数是不合法的,而之所以要移除 -march=*
是因为编译时候指定的架构名字,也就是报错里第二行那一大串是作为 march
参数不合法,故移除
此时重启LSP服务器,可以看见上图中的两个错误消失了,但是鼠标悬浮到代码上还是会出现LSP的 Request textDocument/hover failed.
错误。
这时候我本来也打算用方案一了,因为我找不到具体报错原因了。直到我用Kate打开项目,重启LSP服务器后,提示如下错误信息:
这下有头绪了,去 compile_commands.json
文件里搜 e907
(因为报错提示 e907
这个参数非法)得到了一个参数是 -mtune=e907
,将这个参数加入到 .clangd
文件中,这下文件内容为:
CompileFlags:
Remove:
- '-march=*'
- '-fstrict-volatile-bitfields'
- '-mtune=*'
注意:之所以是把 -mtune=e907
改为 -mtune=*
是因为 *
是作为通配符存在,不过使用前者也是没问题的
之后在Kate中重启LSP服务器后,情况依旧如上,但是是换了一个报错:
重复上面方法,去搜 ilp32f
,得到 -mabi=ilp32f
,加入 .clangd
CompileFlags:
Remove:
- '-march=*'
- '-fstrict-volatile-bitfields'
- '-mtune=*'
- '-mabi=*'
然后重启LSP服务器,功能正常,至此解决。
Kate中正常情况:
VSCode中正常情况: