(保姆级教程)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 自动补全循环模板。
  • 优先级排序:高频使用符号优先显示。
  • 代码诊断(Diagnostics)
  • 实时错误检查:语法错误、类型不匹配、未定义符号等。
  • 集成 Clang-Tidy:静态代码分析(如内存泄漏、代码风格违规)。
  • 代码导航(Navigation)
  • 跳转定义(Go to Definition):快速跳转到变量/函数的定义位置。
  • 查找引用(Find References):列出符号的所有调用位置。
  • 符号大纲(Outline):文件内的结构概览(类、函数、宏等)。
  • 代码重构(Refactoring)
  • 重命名符号(Rename Symbol):跨文件批量修改变量名、函数名等。
  • 提取函数/变量:将选中代码片段提取为独立函数或变量。
  • 文档提示(Hover Information)
  • 类型/参数说明:悬停显示变量类型、函数签名、注释文档。
  • 宏展开预览:直接显示宏定义展开后的代码。

二、clangd插件安装

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

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

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

三、clangd语言服务器下载

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

大家基于自己的操作系统去下载就好了,我是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为例,如下:picture.image

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

四、clangd插件配置

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

4.1 cmake项目生成compile\_commands.json 文件

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

步骤:

  • CMakeLists.txt 中添加以下配置:
  
set(CMAKE\_EXPORT\_COMPILE\_COMMANDS ON)  

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

  
cmake -DCMAKE\_EXPORT\_COMPILE\_COMMANDS=ON ..  

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

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

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

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

4.2 使用 compiledb 工具生成compile\_commands.json 文件

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

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

  • 生成编译数据库:
  
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 文件就行了,整个过程如下:picture.image

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

我这里生成的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文件具体有哪些参数,官网有详细说明,网址如下: https://clangd.llvm.org/config#standardlibrary

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

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

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

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

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

有关trae的一些其他使用技巧,你可以关注公众号后通过菜单栏获取。

另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复知识库3个字获取加入方式。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
CV 技术在视频创作中的应用
本次演讲将介绍在拍摄、编辑等场景,我们如何利用 AI 技术赋能创作者;以及基于这些场景,字节跳动积累的领先技术能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论