一、生成compile_command.json

为什么要这个?vscode的c/c++扩展跳转太慢了,所以我一般都使用clangd,clangd又是依赖compile_commnad.json的。

修改SConstruct文件,在PrepareBuilding之前增加如下代码 env.Tool('compilation_db')

注意⚠️:这个功能对scons有版本要求,如果发现有问题可以起个虚拟环境,安装个新版本的scons。

env['PRJ_CHIP']                  = PRJ_CHIP
env['PRJ_BOARD']                 = PRJ_BOARD
env['PRJ_KERNEL']                = PRJ_KERNEL
env['PRJ_NAME']                  = PRJ_NAME
env['PRJ_APP']                   = PRJ_APP
env['PRJ_DEFCONFIG_NAME']        = PRJ_DEFCONFIG_NAME
env['PRJ_OUT_DIR']               = PRJ_OUT_DIR

# 生成 compile_commands.json
env.Tool('compilation_db')
env.CompilationDatabase()

# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)

这样操作之后直接运行编译命令就可以的了,但是会发现clangd还是没办法跳转,AI了一下解决问题了,在根目录下新建.clangd文件,增加如下内容即可

CompileFlags:
  Add:
    - --target=riscv32
    - -ferror-limit=0
  Remove:
    - -march=*
    - -mabi=*
    - -mcmodel=*
    - -mno-*
    - -xtheade

Diagnostics:
  UnusedIncludes: None
  MissingIncludes: None

原因是使用的工具链(如 riscv64-unknown-elf)包含一些 clangd 无法识别的特殊参数:

  1. (平头哥扩展 (-xtheade) - 这是芯片厂商的自定义指令扩展

  2. 特定的架构参数 - 如特殊的 -march 值

如果不移除这些参数,clangd 会报错,导致代码智能提示功能失效。这个配置文件确保 clangd 能正常工作,同时不影响实际的编译过程。