您好,我是程序员夏叶,深度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++
项目中实现如下功能:
- 代码补全(Code Completion)
-
- 智能上下文感知:基于语法、类型系统和项目符号的精准补全,可以补全变量名、函数名、类成员、命名空间等,
#include
插入头文件时也支持补全文件名。 - 片段补全(Snippets):例如输入
for
自动补全循环模板。 - 优先级排序:高频使用符号优先显示。
- 智能上下文感知:基于语法、类型系统和项目符号的精准补全,可以补全变量名、函数名、类成员、命名空间等,
- 代码诊断(Diagnostics)
-
- 实时错误检查:语法错误、类型不匹配、未定义符号等。
- 集成 Clang-Tidy:静态代码分析(如内存泄漏、代码风格违规)。
- 代码导航(Navigation)
-
- 跳转定义(Go to Definition):快速跳转到变量/函数的定义位置。
- 查找引用(Find References):列出符号的所有调用位置。
- 符号大纲(Outline):文件内的结构概览(类、函数、宏等)。
- 代码重构(Refactoring)
-
- 重命名符号(Rename Symbol):跨文件批量修改变量名、函数名等。
- 提取函数/变量:将选中代码片段提取为独立函数或变量。
- 文档提示(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
中添加以下配置:scssset(CMAKE_EXPORT_COMPILE_COMMANDS ON)
或在构建命令中添加参数:
inicmake -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
-
生成编译数据库:
bashcompiledb -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多个文件了,总感觉跟以前不一样。
好了,今天就说到这里了,如果对你有所启发,欢迎一键三连,如有其他建议,欢迎下方留言评论,谢谢!