WSL2安装Ubuntu及clangd配置

一、前言

WSL2 的全称是 Windows Subsystem for Linux 2 (适用于 Linux 的 Windows 子系统第二代)。简单来说,它是一项由微软开发的技术,让你能够在 Windows 操作系统上直接、无缝地运行一个真正的 Linux 环境,而不需要安装笨重的双系统或传统的虚拟机(如 VMware、VirtualBox)。

它在底层使用了一个高度轻量级的 Hyper-V 虚拟机 ,并在里面运行了一个由微软维护和定制的真正的 Linux 内核

二、 开启 Windows 虚拟化支持

在安装之前,必须确保你的 Windows 已经开启了硬件虚拟化。

  1. 右键点击任务栏,打开任务管理器

  2. 点击"性能"选项卡,在CPU一栏查看右下角的虚拟化是否显示为"已启用"。

    如果未启用,需进入 BIOS 开启 Intel VT-x 或 AMD-V。

三、安装命令

wsl --install

  • 注意 :这个命令会自动安装 WSL2 核心组件以及默认的 Ubuntu 分发版。

  • 如果系统提示已安装,或者你想指定版本,可以使用 wsl --install -d Ubuntu-22.04

四、重启与初始化

  • 命令执行完毕后,必须重启电脑

  • 重启后,会弹出一个 Linux 终端窗口,等待几分钟进行解压。

  • 设置用户名和密码

注意:有可能重新后并不会有linux中断,这样的话只有手动打开wsl窗口重新执行安装命令:
wsl --install -d Ubuntu-22.04

避坑问题

检查 WSL 版本

wsl -l -v

如果 VERSION 下方显示的是 1,请执行 wsl --set-version Ubuntu 2

限制内存占用(防卡死)

WSL2 默认会占用 Windows 80% 的内存,编译内核时可能会把宿主机带崩。

  1. 在 Windows 中按 Win + R,输入 %UserProfile%

  2. 新建一个名为 .wslconfig 的文本文件(注意前面有个点)。

  3. 写入以下内容(假设你电脑 32G 内存,给 Linux 分 16G):

复制代码
[wsl2]
memory=16GB 
processors=8

五、clangd配置

clangd配置是为了让我们更好的去阅读linux内核源码,再次自己的linux内核编译完成。

5.1环境配置

vscode安装clangd插件。(注意是在wsl远程环境下安装的插件,不是本地)

ubuntu需要安装clangd类似于服务器的概念:

sudo apt update sudo apt install clangd -y

5.2收集编译命令

方法一

执行内核自带的脚本,搜集所有编译命令

python3 ./scripts/clang-tools/gen_compile_commands.py

方法二

从 Linux 5.x 版本开始,内核的 Makefile 里其实已经内置了生成 Clangd 索引文件的专门命令:

export ARCH=arm64

export CROSS_COMPILE=aarch64-linux-gnu-

make compile_commands.json

5.3解决交叉编译爆红

由于我们是交叉编译(在 x86 电脑上为 ARM64 编译),Clangd 默认会用本机的 x86 编译器去寻找头文件。为了让跳转 100% 完美,我们需要给 Clangd 写一个配置文件。

例如在你的内核源码根目录(~/rk3588/kernel/),新建一个名叫 .clangd 的文本文件,把下面这段代码复制进去并保存:

CompileFlags:

告诉 Clangd,我们是在为 ARM64 架构编译

Add: "--target=aarch64-linux-gnu", "-Wno-everything"

允许 Clangd 去探测交叉编译器的内部头文件路径

Compiler: aarch64-linux-gnu-gcc

如果由于你裁剪或某些特殊配置导致 make compile_commands.json 报错或仍然没有生成,我们还有一个在原厂被誉为"万能拦截器"的神器:bear

sudo apt install bear -y

bear -- make Image dtbs -j28

注意vscode再执行终端命令时,确保是在ubuntu环境下,而不是在本地。

也需要将C/C++的intense功能关闭

可能会遇到的报错及无法跳转的问题

复制代码
[object Object]

I[16:54:50.640] <-- textDocument/codeAction(37)

I[16:54:50.640] --> reply:textDocument/codeAction(37) 0 ms, error: invalid AST

I[16:54:50.640] --> textDocument/clangd.fileStatus

[Error - 4:54:50 PM] Request textDocument/codeAction failed.

[object Object]

I[16:54:50.703] <-- textDocument/definition(38)

I[16:54:50.703] --> reply:textDocument/definition(38) 0 ms, error: invalid AST

I[16:54:50.703] --> textDocument/clangd.fileStatus

[Error - 4:54:50 PM] Request textDocument/definition failed.

[object Object]

compile_commands.json 7.7MB 的导航图里,全都是写给 gcc 看的编译参数。但是 clangd 底层用的是 clang 引擎。Linux 内核里有大量极其偏门的 GCC 专属参数(比如 -fconserve-stack 等)。当 clangd 读到这些它根本不认识的参数时,它的解析器直接就"脑死亡"了,连树都建不起来,于是抛出 invalid AST

要彻底制服它,我们需要在项目根目录建一个配置文件(.clangd),专门把那些导致崩溃的参数剔除掉。

bash 复制代码
CompileFlags:
  # 强行指定交叉编译器的名字,让 clangd 去找它的头文件
  Compiler: aarch64-linux-gnu-gcc
  # 告诉 clangd 我们的目标架构,并关掉所有烦人的警告
  Add: 
    - "--target=aarch64-linux-gnu"
    - "-Wno-everything"
  # 极其关键:剔除导致 clangd 解析崩溃的 GCC 专属参数!
  Remove: 
    - "-fconserve-stack"
    - "-fno-allow-store-data-races"
    - "-mgeneral-regs-only"
    - "-Wno-psabi"
    - "-mabi=lp64"
    - "-fno-var-tracking-assignments"

修改 VS Code 的 settings.json 参数格式

  1. Ctrl + Shift + P,输入 Open Remote Settings

  2. 选择 首选项: 打开远程设置 (WSL: Ubuntu-22.04) (JSON)

  3. 确保你的 clangd.arguments 是这样的(特别是 --query-driver 的路径,为了防止通配符失效,我们直接写死绝对路径):

bash 复制代码
{
    "clangd.arguments": [
        "--background-index",
        "--query-driver=/usr/bin/aarch64-linux-gnu-gcc",
        "--log=verbose"
    ]
}

既然换了配置文件,必须再次抹除它的记忆,否则它还是会直接抛出之前的 invalid AST 缓存

执行:

bash 复制代码
rm -rf .cache/clangd

重启VScode

相关推荐
AlfredZhao2 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334668 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪9 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫1 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_961875241 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant