前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于WSL2 + VSCode + Clangd 打造最强C/C++编辑器

基于WSL2 + VSCode + Clangd 打造最强C/C++编辑器

作者头像
Flowlet
发布2022-08-18 18:00:37
6.4K0
发布2022-08-18 18:00:37
举报
文章被收录于专栏:FlowletFlowlet

关于作者

作者简介:张帅,WeChat:yorkszhang ,网站:www.flowlet.net

工欲善其事必先利其器,对于程序员来说,代码编辑器/IDE对于代码开发效率与Debug来说至关重要。

笔者最近遇到了这样的情况,单位配置的电脑为苹果的Mac,家里自用电脑的操作系统为Windows;之前在Windows平台进行C/C++代码开发使用的编辑器是Source insight。

这款编辑器在代码跳转、全局搜索、关键字高亮等方面极其优秀,尤其是Source insight(SI) 4.0发布以后解决了海量文件加载挂掉的问题,同时也增加了对于Python语法解析的支持。但是美中不足的一点是SI编辑器只支持Windows平台,因此Mac上进行C/C++开发只能使用公司购买的商业IDE Clion或者使用Microsoft公司的免费编辑器VSCode。

由于工作中除了进行C/C++语言的开发工作外,也会涉及Python、P4等语言的开发工作,因此迫切需要一款跨平台(Mac、Windows、Linux)、跨语言(C/C++、Python、P4等)的代码编辑器。

综合考虑下决定使用VSCode替换SI进行C/C++的代码开发,同时VSCode的插件设计又能够保证对于Python、P4等编程语言的支持。

VSCode自带的C/C++插件除了能够使用Debug功能,其余的代码补全、跳转功能都和基于Clangd的Clion有较大差距。因此本文通过Clangd插件替换VSCode自带的C/C++插件,并通过WSL2(Windows Subsystem for Linux)+ VSCode + Clangd打造C/C++代码编辑器。

本文将从以下几点讲述如何通过WSL2 + VSCode + Clangd打造C/C++代码编辑器。

1、什么是WSL。

Part I:什么是WSL

Part II:WSL vs WSL2

Part III:Windows10安装WSL2

Part IV:安装Windows terminal

2、什么是VSCode。

Part I:VSCode安装与基本介绍

Part II:VSCode常用的插件推荐

3、LSP与Clangd介绍

Part I:什么是LSP

Part II:Clangd介绍

4、VSCode配置Clangd

Part I:WSL2中配置Clangd

1、什么是WSL

  • 什么是WSL

WSL(Windows Subsystem for Linux):Windows Linux子系统,是一个为在Windows 10/11和Windows Server 2019上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层,可让开发人员按原样运行 GNU/Linux 环境且不会产生传统虚拟机的设置开销。

凡是基于Mac从事过Linux开发的都应该对Mac的Unix开发环境的支持、支持绝大部分Unix/Linux命令、集成Git以及包管理工具Homebrew记忆深刻。Windows 10推出WSL以及Windows terminal,可以说是微软对于苹果在PC操作系统层面的追赶。

GNU/Linux桌面发行版虽然拥有良好的Unix开发环境支持,但是具有惨淡的硬件驱动支持、图形环境与生俱来的不稳定性和低效、二流水准的界面设计、以及办公软件的支持差等缺点。

Mac OS具有拥有良好的Unix开发环境支持、良好的图形界面、办公软件齐全,但是在嵌入式开发等场景下需要各种各样的复杂驱动,Mac会陷入环境配置的巨坑中。

Windows10 = Windows + Linux server + Windows Terminal是Win10在保留了Win良好的驱动硬件支持、开放的生态的优点下,又在Unix环境的支持领域追上了Mac与Linux发行版。用户不再需要安装第三方Vmware、Virtualbox虚拟化软件来进行Linux开发。

  • WSL vs WSL2

1)架构比较

WSL 1 使用翻译层将 linux 系统调用转化成 windows 系统调用,该项目最早可以追溯到微软 POSIX subsystem、SFU(Windows Service For UNIX)等项目,WSL 1没有Linux内核,微软要实现一整套对Linux内核的调用转化为对Windows调用的封装,这个工程量是巨大的。

WSL 2 使用了一个轻量级的、无需维护的虚拟机,并在这个虚拟机中运行了一个完整的 linux 内核。

2)特性比较

  • WSL1 和 WSL2 都可以实现在 windows 中带来 linux 操作体验;
  • 启动速度都不慢;
  • 内存消耗都比较小;
  • WSL 1 没有使用的 VM,WSL 2 使用了一个自动维护的 VM;
  • WSL 1 不支持,WSL2 支持可以运行例如 Docker 等程序;
  • WSL 2 支持完整的 linux 内核调用,而 WSL 1 不行;
  • WSL 2 不能与 windows 跨操作系统文件操作(Windows 访问 WSL2 的方法为进行 WSL2 环境键入 “cd ~” 进入主目录后,再键入"explorer.exe ."可在windows 文件管理器中访问 WSL 2 文件,此外还可以通过虚拟机的方法互通文件,如网络,文件共享等),而 WSL 1 则与 windows 在同一文件系统中。
  • Windows10安装WSL2

1)前置条件

必须运行 Windows 10系统的(内部版本号19041或更高版本)或者是 Windows 11系统。

若要检查 Windows 版本及内部版本号,选择 Windows 徽标键 + R,然后键入“winver”,选择“确定” 。

2)安装WSL2

1、查看Windows是否启用虚拟化

打开任务管理器,点击性能选项卡,查看是否启用虚拟化:

2、在管理员 PowerShell 或 Windows 命令提示符中输入此命令

代码语言:javascript
复制
wsl --list --online

查看可通过在线商店获得的 Linux 发行版列表。

3、安装指定的Linux发行版本

代码语言:javascript
复制
wsl --install -d Ubuntu-20.04

安装完成之后,第一次运行需要一些时间来进行初始化配置,然后会提示输入Linux系统的用户名和密码。这里的用户名和秘密不需要与Windows系统的用户名和密码一致,但可以通过sudo来获取管理权限。

4、设置root用户登录WSL2

Ubuntu默认不创建root用户,为了方便进行各种带权限的操作,通过以下命令创建root用户:

代码语言:javascript
复制
sudo passwd root

随后根据系统提示设置密码。

再在Powershell终端,敲入以下命令设置默认登录WSL2的用户为root用户:

代码语言:javascript
复制
ubuntu2004.exe config --default-user root

注意这个地方的命令为ubuntu2004.exe,如果遇到以下错误时,可以输入ubuntu然后敲入TAB键自动补齐到正确的命令:

5、查看WSL版本

代码语言:javascript
复制
wsl -l -v

可以看到刚才安装的Ubuntu发行版,使用的虚拟化平台是WSL 1版本。

6、将指定的Linux发新版的虚拟化平台从WSL 1升级为WSL 2版本

代码语言:javascript
复制
wsl --set-version Ubuntu-20.04 2

若出现最后一句 WSL 2 需要更新其内核组件。有关信息,请访问https://aka.ms/wsl2kernel 需要更新其内核组件。

7、更新WSL 2的内核组件

打开下方链接:

代码语言:javascript
复制
https://docs.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

安装Windows子系统。

8、启动过VMware的机器,需要设置开启Hyper-v

代码语言:javascript
复制
wsl --set-version Ubuntu-20.04 2

出现 “请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化” 提示,

由于VMware与WSL2不兼容,如果机器曾经开启过VMware会导致关闭Hyper-v。

此时我们重新开启Hyper-v,在管理员powershell中输入:

代码语言:javascript
复制
bcdedit /set hypervisorlaunchtype auto

重启电脑。

9、将指定的Linux发新版的虚拟化平台从WSL 1升级为WSL 2版本

代码语言:javascript
复制
wsl --set-version Ubuntu-20.04 2

重新查看WSL版本,可以发现设置成功:

代码语言:javascript
复制
wsl -l -v

10、设置在安装新的 Linux 发行版时将 WSL 2 作为默认版本

代码语言:javascript
复制
wsl --set-default-version 2

现在开始就可以畅享Linux发行版了,跟正常安装的Linux系统没有两样。

3)安装Windows terminal

Windows terminal即windows终端,这是个微软开发的一个命令行工具和 shell程序。它的主要功能是用于访问PowerShell、Cmd和Windows Linux子系统(WSL)等环境,帮助用户在电脑上运行命令,是一个非常优秀的命令行终端工具。

1、安装Windows terminal

Windows terminal安装很简单,Windows 10只需要打开开始,找到Microsoft store,在上面搜索Windows terminal即可获取安装,需要说明的是这种方法需要登录微软账户,没有的话就注册一个即可。

2、设置Windows terminal

打开Windows terminal,选择Ubuntu选项。即可连接到WSL2。

点击设置,配置自动将所选内容复制到剪贴板,以及一些其他外观、配色方案的配置等。

2、什么VSCode

VS Code,全称是Visual Studio Code,但因为全称太长,微软旗下另一款产品visual studio又经常被简称为VS,所以这款与VS有一定渊源的代码编辑器就被简称为VSCode。

它是一个免费的、开源的跨平台编辑器。之所以强调“编辑器”,是因为 VS Code 并无意成为一个全尺寸的集成开发环境,也就是IDE。

  • VSCode安装与基本介绍

1、VSCode安装

登录VSCode官网,选择合适的Stable VSCode版本进行下载,由于笔者操作系统为Windows则选择windows版本进行下载,Windows版本的安装这里不再赘述,由于VSCode服务器在国外,会导致国内下载速率很慢。

Windows用户可以关注公众号:Flowlet,输入:vscode,获取百度网盘链接。

代码语言:javascript
复制
https://code.visualstudio.com/

2、VSCode面板介绍与基本操作

打开VSCode,基本的操作面板如上图所示,VSCode 的基本命令与编辑操作这里不再详细介绍,后续如果有需要可以单独出一篇VSCode操作指南。

  • VSCode常用插件推荐

由于篇幅有限,这里只介绍最基本的一些好用的plugin,后面单独出一篇VSCode的操作指南时再详细介绍。

1、简体中文插件,用于汉化VSCode。

代码语言:javascript
复制
Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code

点击插件管理侧边栏,搜索Chinese Language,然后进行安装。

2、Project Manager,项目工程管理插件。

可以通过VSCode管理多个工程。

其他好用的插件这里不再赘述,本文主要讲Clangd插件的配置与安装。

3、LSP与Clangd配置

  • 什么是LSP

LSP(Language Server Protocol):语言服务协议。

传统的IDE,即使离线使用时也能完成语法检查、自动补全、跳转位置、引用、查找等功能。因为这些IDE的语法特性检查功能都是在本地实现的。不仅如此,各家IDE都有各家的实现。

比如以Java IDE为例,对于Java的语法特性检查,IntelliJ IDEA有其自己的实现方式,Eclipse也有其自己的实现方式。这就造成了对于同一种编程语言的语法解析需要针对不同的IDE进行不同的适配。

其次,语言扫描相关的工作都比较占用CPU资源,运行在vscode进程中不如单独放在一个独立进程,甚至远程服务器上更好。

由于各种新技术新语言层出不穷,VSCode开发人员不可能对任何一种编程语言的语法都了如指掌,专业领域的编程语言的语法解析,由编程语言的开发者来实现是最好的。

LSP(Language Server Protocol) 语言服务协议,此协议定义了在编辑器与语言服务器之间使用的协议。

通过LSP使得编程语言社区能专注于不断完善一个能提供语法检查、自动补全、跳转位置、引用查找等语言特性检查的高性能 “语言服务器” 实现。与此同时,IDE厂商和组织只专注于提供能与任何 “语言服务器” 交互和 “渲染” 响应的实现方案。

其实,LSP只是一种编辑器与语言服务器的解耦,正常情况下可以安装在同一台Windows中,来实现离线语法解析。

  • Clangd介绍

1、LLVM与Clang介绍

LLVM(Low Level Virtual Machine)。LLVM 是以 BSD 许可来开发的开源的编译器框架系统,基于 C++ 编写而成,利用虚拟技术来优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空闲时间,最早以 C/C++ 为实现对象,对开发者保持开放,并兼容已有脚本。

目前 LLVM 因其宽松的许可协议,更好的模块化、更清晰的架构,成为很多厂商或者组织的选择,已经被苹果 IOS 开发工具、Facebook、Google 等各大公司采用,像 Swift、Rust 等语言都选择了以 LLVM 为后端。

大多数编译器由两部分组成:前端和后端。

  • 前端负责语法分析,生成中间代码;
  • 后端以中间代码作为输入,进行架构无关的代码优化,接着针对不同架构生成不同的机器码。

这种架构使得前后端依赖统一格式的中间代码(IR),使得前后端可以独立的变化。新增一门语言只需要修改前端,而新增一个CPU架构只需要修改后端即可。

Objective C/C/C++使用的编译器前端是Clang,Swift使用的是Swift,后端都是LLVM。

2、Clangd工具介绍。

Clang 主要由LibClang、Clang Plugins、LibTooling 几部分组成;

在 LibTooling 的基础之上有个开发人员工具合集Clang tools。Clang Tools是为 C++ 开发人员设计的独立命令行(可能还有GUI)工具。目前只有几个最基础和最根本的的工具保存在主 Clang目录树中,其余的工具保存在一个单独的目录树中称为Extra Clang Tools;

Clang的Extra Clang Tools中有一个工具是Clangd。它是对LSP协议的一个具体实现(当然是建立在Clang的基础之上的),目的是为了给C/C++的编辑器提供编程语言的一些智能化的特性,比如代码分析、引用查找等。

4、VSCode配置Clangd

  • 在WSL2中配置Clangd

本文在WSL2中配置Clangd语言服务器,如果没有安装WSL2也可以在Windows中安装Clangd语言服务器。

1、WSL2更新apt-get源。

代码语言:javascript
复制
sudo apt-get update

2、WSL2安装clangd-12版本。

代码语言:javascript
复制
sudo apt-get install clangd-12

3、将Clangd-12设置为默认的Clangd。

代码语言:javascript
复制
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100

安装完以后,查看通过 "clangd --version" 查看是否安装成功。

4、VSCode安装Remote-WSL插件。

安装完成以后会在左侧侧边栏出现远程链接的图标。

5、VSCode远程连接WSL2。

点击远程连接小图标,然后右键选择Connect to WSL,这时候WSL2会自动下载Remote-WSL2 server服务器。

VSCode连接上WSL2后左下角会显示已经连接的图标。

这时打开文件/文件夹都是在WSL的Home目录下进行了。

6、VSCode在WSL2中安装Clangd客户端插件:

VSCode在WSL2中安装Clangd客户端插件用于与Clangd语言服务器进行LSP协议交互。

在插件管理中搜索Clangd客户端插件,选择 "在WSL:Ubuntu-20.04中安装" ,这个只是VSCode与Clangd语言服务器进行进行LSP协议交互的Clangd客户端。

7、VSCode打开WSL2中的项目文件夹。

这里为了测试,我们以vpp开源项目为例:

代码语言:javascript
复制
git clone https://github.com/FDio/vpp.git

8、生成编译数据库compile database

如果一个项目从0开始编写,智能提示毫无障碍。

如果一个已经存在的大型工程,只需要在build目录下生成编译数据库:compile_commands.json文件即可,clangd 会扫描该文件并为当前项目中的源码生成索引。

C/C++目前主流的构建方式分为3种:

Makefile构建

使用Bear工具来生成compile_commands.json

代码语言:javascript
复制
https://github.com/rizsotto/Bear

Cmake构建

对于Cmake构建的项目,只需要在CMakeLists.txt中添加,然后执行Cmake

Ninja构建

代码语言:javascript
复制
ninja -C out -t compdb cxx cc > compile_commands.json 

对于目前主流的正规开源项目来说都有自己比较方便的方法生成compile_commands.json:

VPP:通过配置compdb参数,生成compile_commands.json

VPP项目编译完成后会在工作目录生成compile_commands.json的文件,我们将这个文件移动到build/目录下,因为Clangd默认读取编译数据库的目录为:工作目录/build/目录下:

代码语言:javascript
复制
cp compile_commands.json build/

9、测试Clangd是索引、跳转是否可用。

我们将鼠标放在vlib_get_node函数发现可以显示函数定义,按住Ctrl+鼠标左键可以进行跳转。至此通过Clangd来实现C/C++的索引、跳转已经完成。

10、Clangd高级设置。

点击左下角的齿轮,选择设置,搜索Clangd。

选择"Clangd:Arguments",可以进行很多高级设置。

"--compile-commands-dir":配置compile_commands.json的默认路径。

"----background-index":配置是否在后台来自动建立代码索引。

具体的各种参数可以在WSL2中通过 "clangd --help" 命令查看,这里不再赘述。

代码语言:javascript
复制
 clangd --help

除此之外Clangd还有clang-dity、clang-format等高级用法,感兴趣的可以自行配置。

(正文完)

end

Reference:

https://docs.microsoft.com/en-us/windows/wsl/

https://www.youtube.com/watch?v=lwhMThePdIo

https://microsoft.github.io/language-server-protocol/

https://docs.microsoft.com/zh-cn/visualstudio/extensibility/language-server-protocol?view=vs-2022

https://clangd.llvm.org/

https://github.com/llvm/llvm-project/tree/main/clang-tools-extra

https://github.com/rizsotto/Bear

转载与投稿

文章转载需注明:Flowlet

欢迎云计算、SDN、NFV、互联网IT等方向的大牛投稿。

后台回复【加群】,加入高手如云群,探讨技术。

| 温馨提示 |

欢迎分享、收藏、点赞、转发。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flowlet 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 由于VMware与WSL2不兼容,如果机器曾经开启过VMware会导致关闭Hyper-v。
  • Clang 主要由LibClang、Clang Plugins、LibTooling 几部分组成;
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档