记一次在AiPi-Open-Kits项目中使用Clangd进行代码补全和阅读时出现的问题

[复制链接]
查看646 | 回复3 | 2023-11-21 00:33:28 | 显示全部楼层 |阅读模式

本帖最后由 SmileYik 于 2023-11-24 18:35 编辑

本帖最后由 SmileYik 于 2023-11-21 00:38 编辑

记一次在AiPi-Open-Kits项目中使用Clangd进行代码补全和阅读时出现的问题

前言

不知道大家会不会注意到一件事情,就是自己用vscode或者其他编辑工具,如atom、kate等打开项目会出现头文件不存在或者是不能正确显示建议和自动补全,还有时候会出现各种莫名其妙的语法提示错误,这有可能是Clangd出了问题。(不知道你们会不会反正我是遇到了)

编译能过去但是编辑器内显示的情况:

image.png

解决方案

方案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服务器)。效果如下,基本上能正常使用语法提示和补全,不存在完全用不了的问题:

image.png

方案2

上一个方案是不依靠 compile_commands.json文件,而这个方案则是依靠此文件,同时此方案应该能完整解决莫名其妙报错问题。(电脑因人而异,我自己用起来目前没异常情况)

在拥有 compile_commands.json且无 .clangd文件情况下,仅简单语法提示,但是不能显示函数功能等,具体如图: image.png 同时当鼠标悬浮到某一单词文本上,LSP服务器就会报错,具体也如下: image.png

此时查阅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服务器后,提示如下错误信息: image.png

这下有头绪了,去 compile_commands.json文件里搜 e907(因为报错提示 e907这个参数非法)得到了一个参数是 -mtune=e907,将这个参数加入到 .clangd文件中,这下文件内容为:

CompileFlags:
  Remove:
    - '-march=*'
    - '-fstrict-volatile-bitfields'
    - '-mtune=*'

注意:之所以是把 -mtune=e907 改为 -mtune=* 是因为 * 是作为通配符存在,不过使用前者也是没问题的

之后在Kate中重启LSP服务器后,情况依旧如上,但是是换了一个报错: image.png

重复上面方法,去搜 ilp32f,得到 -mabi=ilp32f,加入 .clangd

CompileFlags:
  Remove:
    - '-march=*'
    - '-fstrict-volatile-bitfields'
    - '-mtune=*'
    - '-mabi=*'

然后重启LSP服务器,功能正常,至此解决。

Kate中正常情况: image.png

VSCode中正常情况: image.png

回复

使用道具 举报

496199544 | 2023-11-21 15:26:29 | 显示全部楼层
回复

使用道具 举报

WT_0213 | 2023-11-21 15:28:45 | 显示全部楼层
回复

使用道具 举报

心云 | 2024-1-1 11:49:25 | 显示全部楼层
👍
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则