WSL2 + VsCode 配置 C++ 开发环境指南

发布于 8 天前  45 次阅读


开始前的准备

你需要安装好 VsCode,并使用下面命令检查你的 wsl 的版本:

wsl -l -v

image-20220916221919554

如果从未安装过 wsl,或者版本为 1,都需要执行以下步骤升级 wsl:

在 Windows 功能中勾选 Hyper-V

img

新版的 Win10 可能是下面这样:

image-20220916222459803

然后开启hyper-v模式,PowerShell中执行:

bcdedit /set hypervisorlaunchtype auto

然后下载 wsl_update_x64.msi,百度网盘链接,提取码:6666

使用 wsl --set-version <distro name> 2 命令将 <distro name> 替换为要更新的 Linux 发行版的名称。 例如,wsl --set-version Ubuntu-20.04 2 会将 Ubuntu 20.04 发行版升级到 WSL 2

更多请参加官方文档

安装 Ubuntu

无法通过命令行安装最新版的 Ubuntu 22.04.1

image-20220916224559307

尝试在应用商店搜索安装:

image-20220916224214462

image-20220916224614425

下载完成后打开:

image-20220916224804432

稍等片刻,即成功安装

设置 root 密码:

sudo passwd root

image-20220916225151410

切换到 root:

su

接下来换源,这里我选择清华源,找到对应的 ubuntu 版本,这里以 22.04 LTS 为例

cd /etc/apt
# 备份一下
cp sources.list sources.list.bak
# 换源
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
# 更新
apt update

image-20220916225829174

配置 C++ 环境

安装常用编译软件包 build-essentialgdb

apt install build-essential
apt install gdb

查看当前 g++ 版本

g++ -v

这里我已经是 g++ 11.2.0

image-20220916230444463

可以再升级一下相关联的软件包:

apt upgrade g++

找个文件编译试试,你会发现已经支持c++ 23了,太棒啦

image-20220916230919795


下面是失败的折腾记录,请省略

然后我 WSL Ubuntu 22.04 死活也连不上,提示 VS Code Server for WSL closed unexpectedly. Check WSL terminal for more details,搜了各种解决办法都没有成功,我以为是两个 22 的 SSH 端口冲突了,但修改端口后也连不上,SSH 要连上 WSL 好像有点麻烦,需要重装 openssh-server,还要配置端口转发(?)

无可奈何,那试试升级原来的 20:

apt update
apt upgrade -y
apt dist-upgrade -y
apt autoclean
apt autoremove -y

apt install update-manager-core
do-release-upgrade -d

image-20220917002937351

image-20220917003049010

升级成功,最后能在 VsCode 里面使用 -std=c++23

第二天我发现把 Ubuntu 22 的 wsl 升级到 2 就能连上了,离谱,原来我的 20 的 wsl1 在没升级的情况下也能连上啊(??)昨天我是打算先连上再升级的😓

好吧,现在我有两个 WSL Ubuntu 22,拿来感觉没啥用,本来打算一个 20 一个 22 或许还有点用(图中的20已经是22了,只是NAME没改罢了)

image-20220917110516015


接下来我使用一个没有任何配置的文件夹来演示如何在 VsCode 下配置 C++ 环境

image-20220917110938859

连接 WSL:

image-20220917111049552

可以看到左下角显示已经连接成功,

image-20220917111122860

首先根据自行需要安装下面的拓展:

image-20220917112351696

打开文件夹,

image-20220917111231677

image-20220917111327938

按下 F5,选择 g++ 生成调试活动文件

image-20220917111433034

这时候提示下面的东西无需理会,刚刚只创建了task.json,还没有创建 launch.json

image-20220917111712480

这是刚刚 task.json 已经自动创建的内容:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

然后 Ctrl + Shift + P

image-20220917112012612

得到 c_cpp_properties.json,内容如下:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

再创建 launch.json

image-20220917112222032

image-20220917112740423

然后把 "program" 改下,复制 task.json里面的"${fileDirname}/${fileBasenameNoExtension}"(生成的文件所在位置和文件名)

这时候 Ctrl + F5 非调试模式运行,已经能正常启动程序了

image-20220917113152996

这时候点调试也能正常使用了:

image-20220917113240783

目前这样的话你需要确保每次调试前都 -g 编译生成了最新的可执行文件,为了省去这一步骤,在launch.json 中添加一项:

"preLaunchTask": "C/C++: g++ 生成活动文件",

最后完整 launch.json 如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "preLaunchTask": "C/C++: g++ 生成活动文件",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

后续

可以在c_cpp_properties.json 中定义宏

"defines": ["LRL52"],

task.json 中的 args 也添加上:

"-DLRL52",

关于栈空间,在 Linux 下使用:

ulimit -a

查看栈空间:

image-20220917122140826

可以看到默认栈空间只有 8 MB

修改栈空间为 125MB($12800 = 125 \cdot 1024$):

ulimit -s 128000

CPH 运行正常:

image-20220917122358468


昨日的月光悄然退场,曦阳已经渐亮