一、生成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 无法识别的特殊参数:
-
(平头哥扩展 (-xtheade) - 这是芯片厂商的自定义指令扩展
-
特定的架构参数 - 如特殊的 -march 值
如果不移除这些参数,clangd 会报错,导致代码智能提示功能失效。这个配置文件确保 clangd 能正常工作,同时不影响实际的编译过程。