Visual studio Code的clangd插件一篇通,上乘的C/C++开发环境配置

2023-11-05

系列文章

苦于微软出品的 C/C++ 插件久矣,时不时就会出现代码提示失效,跳转失败的问题。现在火热的Jetbrains公司的Clion以及Vim上的Youcompleteme插件现在都在用clangd,相比于 C/C++扩展,clangd具有全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等功能,内存占用和资源占用上也更具优势。

好的工具安装也不是一蹴而就的,下面记录一下安装使用vscode-clangd的艰辛历程

本人系统环境 CentOS Linux release 7.9.2009 (Core)

clangd插件安装

  1. clangd插件与微软的C/C++相关插件冲突,那么安装之前关闭
    Ctrl + Shift + X在扩展商店中搜C/C++禁用已安装的C/C++插件,如C/C++C/C++ Themes
  2. 安装clangd插件
    Ctrl + Shift + X在扩展商店中搜clangd安装即可
  3. 安装clangd应用,clangd插件是基于clangd命令实现的
    Ctrl + Shift +P在命令窗口中搜clangd: Download language server ,vscode自动从https://github.com/clangd/clangd/releases下载最新的clangd包,剩下就是焦灼的等待。

第三步也可以手动下载对应的离线包,如clangd-linux-16.0.2.zip,然后解压后将其bin路径配置到PATH环境变量中,重启vscode即可。

不幸的是一遍遍的安装一遍遍的提示找不到不clangd需要下载安装,手动执行clangd --version出现bin/clangd: /lib64/libc.so.6: version GLIBC_2.18’ not found (required by bin/clangd)`错误提示。

rpm -qf /lib64/libc.so.6查看这个动态库属于glibc-2.17-325.el7_9.x86_64,通过命令strings /lib64/libc.so.6 | egrep ^GLIBC_2查看其兼容的版本号。

CentOS上各种库与工具相对来说版本都很低。那么接下来更新一些工具库来源码编译clangd

源码编译clangd

clangd understands your C++ code and adds smart features to your editor: code completion, compile errors, go-to-definition and more.

clangd is a language server that can work with many editors via a plugin. Here’s Visual Studio Code with the clangd plugin, demonstrating code completion:

clangd is based on the Clang C++ compiler, and is part of the LLVM project.

升级cmake版本

根据llvm源码告警,cmake版本不低于3.20.0

  1. 下载Binary distributions
    wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4-linux-x86_64.tar.gz
  2. 解压
    tar -xvf cmake-3.27.4-linux-x86_64.tar.gz
  3. 将cmake的bin目录添加到PATH路径里,如export PATH=/usr/local/cmake-3.27.4-linux-x86_64/bin:$PATH

升级gcc版本

根据cmake告警提示Host GCC version must be at least 7.1, your version is 4.8.5.,gcc版本不低于7.1,这里直接安装使用scl的devtoolset-8工具链

yum install -y centos-release-scl
yum install -y scl-utils-build
yum install -y devtoolset-8-toolchain
scl -l
scl enable devtoolset-8 bash

编译clangd

  • 参考官方资料 https://clangd.llvm.org/ faq
  • 下载llvm-project源码包
    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.6/llvm-project-16.0.6.src.tar.xz
  • 编译参数
    tar -xvf llvm-project-16.0.6.src.tar.xz
    mkdir llvm-project-16.0.6.src/build
    cd llvm-project-16.0.6.src/build
    cmake3 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/llvm-16.0.6 -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ../llvm
    make install -j $(nproc)
    
  • 编译完成后将/usr/local/llvm-16.0.6/bin添加到PATH环境变量中

配置

配置相对来说比较复杂,包括插件配置,工程配置,格式化风格配置等

插件配置

Ctrl + ,切换出配置页面,【工作区】【扩展】【clangd】,也可以在settings.json直接配置,其中clangd.arguments的配置clangd --help即可

// 是否检查插件冲突
"clangd.detectExtensionConflicts": true,
"clangd.path": "clangd",
// 查找的头文件路径,每一项前缀 -I
"clangd.fallbackFlags": [],
"clangd.arguments": [
	// 在后台自动分析文件(基于complie_commands)
    "--background-index",
    // 标记compelie_commands.json文件的目录位置
    // "--compile-commands-dir=build",
    // 同时开启的任务数量
    "-j=12",
    // 全局补全(会自动补充头文件)
    "--all-scopes-completion",
    // 更详细的补全内容
    "--completion-style=detailed",
    // Include what you use
    "--header-insertion=iwyu",
    // pch优化的位置 disk memory
    "--pch-storage=memory",
    "--cross-file-rename",
    "--enable-config",
    // clang-format style to apply by default when no .clang-format file is found
    "--fallback-style=WebKit",
    "--pretty",
    "--clang-tidy",
    "--query-driver=clang++",
]

Project setup

clangd is based on the clang C++ compiler, and understands even complex C++ code. However, you must tell clangd how your project is built (compile flags). A compile_commands.json file can usually be generated by your build system

参考 Project setup官方文档,总结三种生成compile_commands.json文件的方法

  • 如果通过 cmake 方式编译项目,在CMakeLists.txt文件中 添加 set(CMAKE_EXPORT_COMPILECOMMANDS ON),之后cd build && cmake ..,可以发现在 build 目录下已经生成了compile_commands.json文件

  • 如果是基于make方式来编译,那么可以先安装pip install compiledb,之后在当前目录下运行

    • compiledb -n make -C build
    • compiledb make -C build

    这两个命令中的其中一个来生成 compile_commands.json 文件,其中前者不会执行真正的 make 编译命令。

  • 如果是基于其他方式,可以使用 https://github.com/rizsotto/Bear 项目中的方式来生成对应的 compile_commands.json 文件

格式化配置文件

配置默认的格式插件

  1. 选择需要设置格式化插件的文件
  2. 鼠标右键进行点击
  3. 选择 【使用…格式化文档】
  4. 选择 【配置默认格式化程序】
  5. 选择你需要的格式化插件即可,如clangd

也可以参考下列配置

"[cpp]": {
   // 在cpp文件中,编辑器在保存的时候进行格式化
   "editor.formatOnSave": true,
   "editor.formatOnSaveMode": "file"
   // 在cpp文件中,编辑器在打字的时候进行格式化
   "editor.formatOnType": true,
   // 在cpp文件中,编辑器在粘贴的时候进行格式化
   "editor.formatOnPaste": true,
   "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
}

clangd根据.clang-format配置文件进行格式化代码,若改配置文件未找到,则使用fallback-style参数指定的风格进行格式化代码。

clang-format工具提供格式化功能,默认提供几个比较流行的代码风格。可以根据官方文档给出主流的代码风格连接进行查看,也可以使用工具进行格式处理查看效果

  • clang-format --style=LLVM -i main.cpp对main.cpp源文件进行格式化处理,并改写原文件。
  • clang-format --style=LLVM --dump-config > .clang-formatdump LLVM代码风格的配置文件,可以在此基础上根据需要进行调整,具体各配置项的代表意义可根据官方文档说明来理解。

将配置好的.clang-format文件放在工程目录下即可,不要过多的纠结细节

clang-tidy配置

  • 占个坑,待有空真实体验以后再补充

总结

至此,上乘的C/C++的VSCode开发环境需要的主要依赖的插件

  • CMake
  • CMake Tools
  • clangd,其实涵盖了Clang Format以及Clang Tidy功能
  • Doxygen Documentation Generator

技巧

  • Ctrl + Shift + P显示所有命令,查找Preferences: OPen Default Settings (JSON),可以查看默认的配置文件,可以根据需要来定制进行环境的迁移
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual studio Code的clangd插件一篇通,上乘的C/C++开发环境配置 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli

随机推荐

  • CTF_ctfshow_登录就有flag

    打开靶机是一个登录界面 试了一下普通的sql注入 1 or 1 1 不行 所以这里用 0 分号可以用于闭合 井号可以用于注释 进行异或运算 等号就是判等 这里需要利用sql的一个点 mysql弱类型转换 空异或0会查到所有非数字开头的记录
  • Transformers库学习-part1

    文章目录 C0 Setup C1 Transformers models Working with pipelines Zero shot classification How do Transformers work Transforme
  • python 学习笔记(三)---turtle库的使用(超详细)

    python 学习笔记 三 turtle库的使用 文章目录 python 学习笔记 三 turtle库的使用 1 turtle库的简介 2 turtle绘图窗体布局 3 turtle的空间坐标体系 绝对坐标和海龟坐标 4 turtle的角度
  • 决策树和信息增益的理解

    决策树 通俗来说 决策树分类的思想类似于找对象 现想象一个女孩的母亲要给这个女孩介绍男朋友 于是有了下面的对话 女儿 多大年纪了 母亲 26 女儿 长的帅不帅 母亲 挺帅的 女儿 收入高不 母亲 不算很高 中等情况 女儿 是公务员不 母亲
  • 【模板】二维前缀和与二维差分

    文章目录 1 二维前缀和 1 1 求解二维前缀和数组 1 2 区间查询 2 二维差分 2 1 定义 2 2 区间修改 2 3 初始化 前缀和是一种极其优秀的线性结构 也是一种重要的思想 能极大地降低区间查询的时间复杂度 为了方便 涉及到前缀
  • GitLab服务器IP地址设置

    最近使用GitLab 搭建了Git的私有仓库 但是发现私有仓库的地址居然是localhost 不是本机的IP地址 最后百度了一下 找了很久才找到 特此记录一下 首先说明一下 我linux虚拟机的IP地址是192 168 142 134 1
  • PO和PM的区别

    PO是product owner 是一个role 负责与stakeholders打交道 提炼stakeholders的需求 按照需求的价值以及紧急程度安排优先级 PO是一个角色 对product backlog负责 通俗地讲 product
  • uniapp中位置授权提示

    前言 因项目的需求 需要 首次登录小程序的用户 一进来就显示一个弹窗 提示 点击允许打印的结果 官网地址 uni getSetting 获取用户的当前设置 出现弹窗的原因是因为使用 了 uni authorize 这个属性 还需要在 man
  • 数据库(DDL)

    数据库 一 数据库类型 1 关系型数据库 Oracle 银行 政府 MySQL 最广泛 2 非关系型数据库 redis mongodb 二 数据库的核心元素 1 sql 关系型的数据库语言 结构化查询语言 2 Mysql 具体的数据库 3
  • vue3+Element-plus 动态路由配置

    使用vue3 Element plus 进行动态路由配置 首先来看一下路由结构 免得出现疑惑 const routes path login name Login meta title 登录页面 component gt import vi
  • 前端整合图片上传组件

    复制头像上传组件 从vue element admin复制组件 vue element admin src components ImageCropper vue element admin src components PanThumb
  • 流媒体之播放flv格式的视频

    起因 项目之前支持高清预览 但是不支持flv格式的视频 所以 为了让他支持flv格式 我去整理了一些相关资料 发现 有两种方式 一个是采用插件 一个是使用b站开源的flv js 详情见下 flv js简介 Flv js 是 HTML5 Fl
  • vue自定义穿梭框支持远程滚动加载

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 技术框架公司的选型 老项目 vue2 iview ui 方案的实现思路是共性的 展现UI样式需要你们自定义进行更改 因为iview是全局注入
  • WSL 配置中文输入法

    1 安装输入法 sudo apt install dbus x11 im config fonts noto fcitx fcitx pinyin fcitx sunpinyin fitx googlepinyin 2 设置自动启动 命令行
  • 深入解析G1垃圾收集器与性能优化

    本文详细介绍G1垃圾收集器的参数配置 如何进行性能调优 以及怎样对GC性能进行分析和评估 文章目录 0 G1简介 1 垃圾回收阶段简介 2 纯年轻代模式的垃圾收集 3 混合模式的垃圾收集 4 标记周期的各个阶段 5 常用参数与默认值 XX
  • 整合Windows 7 / server 2008更新补丁包

    哈喽 大家好 今天主要是给学习win7和server2008的小伙伴准备的一样好东西 UpdatePack7R2 这是是由俄罗斯大神Simplix制作的Windows 7 和 server 2008的更新补丁离线安装包 里面整合了Windo
  • 数组中子数组和为固定值的题目汇总

    开头附件一部分数组去重的知识 C 中数组 Vector中去除重复元素 unique函数是一个去重函数 去除相邻中的重复元素 只留一个 其中 最关键的是 并不是删除并不是把重复的元素删除 而是全部放倒数组的后面 因为 unique只是去除 相
  • linux查询端口冲突情况

    1 netstat anp grep 80 输出 unix 2 ACC STREAM LISTENING 48026 7112 master private tlsmgr 若 出现LISTEN则冲突 LISTENING正常
  • 01-----关于更换网络之后,xshell无法连接虚拟机(之前还能连接)

    1 解析 我本来在一个网络中是正常能使用xshell连接我的本地虚拟机的 但是后面回到家里的wifi后 突然就连不上了 经过排查 发现是新的wifi的与原本建立好的网络环境不一致 具体是ip不在同一网段 重新配置一下 例如我是这样操作的 看
  • Visual studio Code的clangd插件一篇通,上乘的C/C++开发环境配置

    系列文章 Visual studio Code的C C 开发环境搭建 Visual studio Code的clangd插件一篇通 上乘的C C 开发环境配置 苦于微软出品的 C C 插件久矣 时不时就会出现代码提示失效 跳转失败的问题 现