(保姆级教程)Trae中使用clangd插件实现c++代码函数列表、变量补全、代码跳转等功能

您好,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧和经验,有兴趣的可以关注我的公众号,一起学习,共同进步。

之前发过两篇文章,分别讲了在Trae中编译和调试c++项目原理和方法,如下:

在原生IDE中开发c++如鱼得水,到了Trae中就抓瞎了,怎么破?

拒绝切换IDE,10分钟让Trae编辑器化身C++神器,智能补全、编译调试一网打尽

编译和调试搞定以后,还有最重要的一点,就是开发过程中怎么使用代码补全、函数列表、跳转等功能,Trae是基于vscode开发的,基本上这一类编辑器实现这些功能都是使用插件,在此之前,最方便的就是直接下载微软的c/c++插件,但是现在微软不让用了,原因我在之前的文章里面讲过了,后面我试了多款插件,比如clangd,ccls等,经过对比,最后我认为还是clangd插件比较方便和强大,今天这篇文章将详细的讲解在Trae中怎么配置clangd插件。

一、clangd插件功能介绍

clangd是一款在vscode/trae/cursor等编辑器中用来开发c/c++的插件,clangd插件支持在c/c++项目中实现如下功能:

  1. 代码补全(Code Completion)
    • 智能上下文感知:基于语法、类型系统和项目符号的精准补全,可以补全变量名、函数名、类成员、命名空间等,#include插入头文件时也支持补全文件名。
    • 片段补全(Snippets):例如输入 for 自动补全循环模板。
    • 优先级排序:高频使用符号优先显示。
  2. 代码诊断(Diagnostics)
    • 实时错误检查:语法错误、类型不匹配、未定义符号等。
    • 集成 Clang-Tidy:静态代码分析(如内存泄漏、代码风格违规)。
  3. 代码导航(Navigation)
    • 跳转定义(Go to Definition):快速跳转到变量/函数的定义位置。
    • 查找引用(Find References):列出符号的所有调用位置。
    • 符号大纲(Outline):文件内的结构概览(类、函数、宏等)。
  4. 代码重构(Refactoring)
    • 重命名符号(Rename Symbol):跨文件批量修改变量名、函数名等。
    • 提取函数/变量:将选中代码片段提取为独立函数或变量。
  5. 文档提示(Hover Information)
    • 类型/参数说明:悬停显示变量类型、函数签名、注释文档。
    • 宏展开预览:直接显示宏定义展开后的代码。

二、clangd插件安装

打开Trae的插件扩展市场,搜索clangd进行安装,如下:

安装完插件后,从插件介绍可以看到,它需要另外安装一个clangd语言服务器,如下:

所以接下来去下载一个clangd语言服务器,用来支持clangd插件的正常使用。

三、clangd语言服务器下载

clangd是LLVM项目提供的C/C++/Objective-C语言服务器,基于Clang编译器实现,我们到如下网址去下载: github.com/clangd/clan...

大家基于自己的操作系统去下载就好了,我是windows, 所以我下载的是clangd-windows-19.1.2.zip 这个,下载下来以后解压,把解压的目录放到D:\Programs目录下,然后可以看到在D:\Programs\clangd-windows-19.1.2\clangd_19.1.2目录下有两个文件夹,一个是bin,存放的是clangd.exe程序,这个就是我们需要的语言服务器了,另外一个是lib,这里面存放的是一些标准库头文件。

需要使用clangd.exe还有关键的一步,我们需要把它的路径加入到系统环境变量中,以windows为例,如下:

重新打开一个终端,试一下,看看exe程序是否可用,如下:从截图可以看到,clangd程序已经可用了,并且版本也是我们下载的19.1.2的版本。

四、clangd插件配置

插件和语言服务器都安装好以后,剩下的就是clangd插件的配置了,clangd插件要想起作用,除了上述的语言服务器之外,它还需要与构建系统集成,需要依赖一个名字为compile_commands.json的配置文件,这个文件里面实际上就是你所有项目源文件的编译命令,clangd需要通过这个配置文件知道你的项目是怎么编译的,进而对项目进行语法语义的解析,这个配置文件是需要我们自己自动生成的,根据项目形式的不同,我把它的生成方式分为3种,下面分别进行讲解。

4.1 cmake项目生成compile_commands.json 文件

适用场景:项目本身使用 CMake 作为构建系统。

步骤:

  • CMakeLists.txt 中添加以下配置:

    scss 复制代码
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

    或在构建命令中添加参数:

    ini 复制代码
    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
  • 重新执行cmake命令后,会在 build 目录生成 compile_commands.json。可以将这个配置文件软链接或复制到项目根目录,确保 clangd 能自动识别。

比如我这里,生成compile_commands.json文件以后,clangd自动识别到了,就自动生成了相应的索引文件,如下:

接下来试一下,符号跳转功能能不能正常使用,如下:

可以看到整个过程就非常的丝滑了,特别nice,其他功能我就不一一试用了,大家可以自行尝试。

4.2 使用 compiledb 工具生成compile_commands.json 文件

适用场景:项目直接使用makefile文件来作为构建系统。 步骤:

  • 安装 compiledb(依赖python,如果没有安装python需要先安装python):

    复制代码
    pip install compiledb
  • 生成编译数据库:

    bash 复制代码
    compiledb -n make      # 仅生成json配置文件,不执行编译
    compiledb make         # 执行编译并生成json配置文件

执行完compiledb命令后,可以看到compile_commands.json 文件已经生成,后续使用跟上一小节一致就可以了。

这种场景还有一个工具叫做bear,也能用,但是因为bear只能在linux或者mac中使用,windows要使用的话还需要安装wsl,比较麻烦,所以这里就不多说了。

4.3 使用AI写脚本自动生成compile_commands.json 文件

实际的很多c/c++项目总有很多特殊的场景,要么没有使用make系列的构建工具,要么编译依赖一些特殊的环境,要么编译过程复杂,以上两种场景都不适用的情况,怎么破呢?

换做以前,还不太好弄,会比较麻烦,但是现在我们用的是Trae啊,它是一个AI编辑器,多简单,直接让它扫描一下整个项目,然后帮忙写一个python脚本生成compile_commands.json 文件就行了,整个过程如下:

Trae不只帮我们生成了python文件,还运行了,我这里显示运行失败是因为终端打开时间过长,它判断失败了,实际上是运行成功的,等它输出完,我在项目跟目录已经看到了compile_commands.json 文件,同时不知不觉中,clangd已经自动识别到了json文件并且生成了索引,如下:

我这里生成的python脚本代码如下:

python 复制代码
#!/usr/bin/env python3
import os
import json
import sys

def find_cpp_files(directory):
    cpp_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(('.cpp', '.cxx', '.cc')):
                cpp_files.append(os.path.join(root, file))
    return cpp_files

def generate_compile_command(file_path):
    # 基本编译选项
    compile_flags = [
        '-g',  # 调试信息
        '-W',  # 启用警告
        '-fPIC',  # 生成位置无关代码
        '-std=gnu++11'# C++11标准
    ]
    
    # 获取相对于项目根目录的路径
    rel_path = os.path.relpath(file_path, project_root)
    
    # 添加头文件搜索路径
    include_dirs = [
        '.',
        'en_decrypt',
        'ftp',
        'log',
        'network',
        'readini',
        'test'
    ]
    
    includes = [f'-I{os.path.join(project_root, d)}'for d in include_dirs]
    
    return {
        'directory': project_root,
        'command': f'g++ {" ".join(compile_flags)} {" ".join(includes)} -c {file_path} -o {os.path.splitext(file_path)[0]}.o',
        'file': file_path
    }

if __name__ == '__main__':
    # 获取项目根目录
    project_root = os.path.dirname(os.path.abspath(__file__))
    
    # 查找所有C++源文件
    cpp_files = find_cpp_files(project_root)
    
    # 生成编译命令
    compile_commands = [generate_compile_command(f) for f in cpp_files]
    
    # 写入compile_commands.json文件
    output_file = os.path.join(project_root, 'compile_commands.json')
    with open(output_file, 'w') as f:
        json.dump(compile_commands, f, indent=2)
    
    print(f'Generated {output_file} with {len(compile_commands)} entries')

全是AI一次生成的,我一个字都没有动过,一般只要项目结构合理,AI生成的脚本都没有问题的,如果你感觉有点不对,比如头文件目录包含不全等,你就告诉AI,让它修改脚本,然后重新生成。

当你用起clangd插件以后会发现真的挺爽,相比而言,我感觉比之前微软的c/c++插件要好用一些,反正我是挺喜欢的,用起来特别舒服。

到这里clangd插件基本上就可用了,但是如果你还有一些特别的需求,比如文件后缀名不是c/c++标准的,或者对于clangd插件的使用做一些自定义的配置,那还可以配置.clangd文件,对于.clangd文件具体有哪些参数,官网有详细说明,网址如下: clangd.llvm.org/config#stan...

那么我们需要手动配置吗,我认为不需要,直接把这个网址作为上下文喂给AI,如下:

如果你不愿意一项一项的看,那么让AI直接帮你总结下也是可以的,或者你有什么特别的配置,直接让AI帮你生成.clangd文件也可以,比如有一些标准库头文件,因为我们没有指定路径,clangd找不到就会提示错误,再比如,有一些自定义的c/c++文件,后缀名可能与标准的不一致,clangd不能识别为c++文件,这个时候我们就直接喂给AI,如下:

然后一个可用的.clangd配置文件就生成了,接下来我们试一下前面说的clangd插件的功能,如下:

可以看到悬停、大纲列表、头文件跳转、变量跳转等等用起来都特别的丝滑,说起来今天不知道咋回事,老感觉Trae是不是涨智商了,上下文可以索引到100多个文件了,总感觉跟以前不一样。

好了,今天就说到这里了,如果对你有所启发,欢迎一键三连,如有其他建议,欢迎下方留言评论,谢谢!

相关推荐
菠萝011 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
海棠蚀omo1 小时前
C++笔记-C++11(一)
开发语言·c++·笔记
凌佚2 小时前
rknn优化教程(一)
c++·目标检测·性能优化
粥里有勺糖3 小时前
用Trae做了个公众号小工具
前端·ai编程·trae
夕颜1113 小时前
让 cursor 教我用 cursor 的隐藏技能
后端·trae
杂雾无尘4 小时前
用 Trae 打造全栈项目魔法师 - 让项目初始化不再是噩梦
aigc·openai·ai编程
量子位4 小时前
Figure 机器人分拣快递新视频曝光,网友:太像人类
llm·ai编程
量子位4 小时前
Gemini 新版蝉联竞技场榜一,但刚发布就被越狱了
ai编程
偶尔的鱼5 小时前
Cursor 1.0 正式发布:AI 编程从「助手」变「队友」,真香预警!
ai编程
Lenyiin5 小时前
《 C++ 点滴漫谈: 四十 》文本的艺术:C++ 正则表达式的高效应用之道
c++·正则表达式·lenyiin