从C/C++ Extension到Clangd:Linux开发实战

2023-12-20 12:04

本文主要是介绍从C/C++ Extension到Clangd:Linux开发实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从C/C++ Extension到Clangd:Linux开发实战

    • 1. 为什么使用Clangd
    • 2. VSCode + Clangd
    • 3. 生成compile_commands.json
    • 4. Linux开发实战
      • 4.1 Linux内核模块开发
      • 4.2 Linux内核开发
    • 5. 总结

1. 为什么使用Clangd

最初入门VSCode写C程序的时候,各种教程推荐我们安装C/C++ Extension,然后在.vscode/c_cpp_configurations.json里书写编译命令,这对于写Hello World等简单的应用程序而言是再方便不过的了。

然而随着编程级别的不断深入,接触到的目录结构越来越复杂,需要一套编译框架来帮助我们编译整个工程。Makefile/Cmake应运而生。在大型项目结构下(例如:Linux Kernel),.vscode/c_cpp_configurations.json的代码提示功能逐渐捉襟见肘:你会看到各种代码飙红,跳转失灵/失败现象。

Clangd能够很好地解决这一问题。在我理解来看,Clangd会将项目编译的整个过程索引下来,建立起代码跳转结构,从而基本做到0延迟0错误的跳转

2. VSCode + Clangd

相关配置教程已经有很多了,以下是博主的参考

  • 借助clangd实现VSCode C++代码补全

这里值得说明的是两个问题:

  1. Clangd版本选择clangd 版本必须大于11代码才能够高亮,参考这里。Ubuntu一般来说会提供许多clangd版本供选择,下载正确版本(例如:clangd-12)。
  2. Clangd路径配置:VSCode通过ctrl + shift + p 打开设置,在拓展中找到clangd,下拉找到Path,修改为对应Clangd的路径即可。值得说明的是,如果系统默认的Clangd版本已经大于11了,那么这一步可以忽略。

在这里插入图片描述

3. 生成compile_commands.json

Clangd搜索--compile_commands-dir路径下的compile_commands.json文件来建立索引结构,compile_commands.json指明了该工程的编译方式。下面是--compile_commands-dir配置的一个例子。
在这里插入图片描述
生成compile_commands.json的方式主要有两种,可以参考博主上一篇博客。

4. Linux开发实战

接下来用两个Linux开发例子展示Clangd的强大之处。

4.1 Linux内核模块开发

很久以前博主写过这样一篇博客:用VSCode进行Linux内核模块开发的BUG解决方案。这里面讲述了如何通过配置.vscode/c_cpp_configurations.json来避免VSCode的错误提示。

使用Clangd后,在模块目录下(确保你有正确的Makefile)直接运行

make clean && bear make

即可生成compile_commands.json,重新加载一下窗口就能进行任意跳转。

4.2 Linux内核开发

Linux内核目录结构极为复杂,每个目录都有自己的Makefile。社区提供了一个脚本来生成compile_commands.json

需要注意的是,在运行该脚本前,需要config并编译内核,这样脚本才能生成对应的编译命令。流程如下

# 生成.config
make menuconfig
# 最大核心编译内核
make -j$(nproc)
# 生成compile_commands.json
python3 ./scripts/clang-tools/gen_compile_commands.py

等待Clangd自动构建索引,然后就能丝滑跳转。

5. 总结

随着开发结构愈发复杂,.vscode/c_cpp_configurations.json无法很好地进行代码跳转任务。本文介绍了如何通过Clangd进行更丝滑开发的办法。掌握这一点,我们就可以🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫

这篇关于从C/C++ Extension到Clangd:Linux开发实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515976

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现