基于vscode与wsl配置c++环境(ACM向)

本文基于 wsl1 配置,wsl2 暂未试过。

参考vscode官方基于wsl cpp环境配置: https://code.visualstudio.com/docs/cpp/config-wsl

首先设定一下自己的目录结构:

1
2
3
4
5
6
| .vscode           // vscode的配置文件,下文的tasks.json、launch.json都在这里
| workspace // 自己的工作目录
| --| build // 编译的结果会在这个目录
| --| main.cpp // 主文件
| otherfolder // 如果做成git仓库,可以这里归档自己的代码
| .gitignore // git仓库忽略的文件,可以忽略 .vscode 和 workspace 这两个目录

安装vscode、wsl,vscode的file菜单勾上 Auto Save

vscode 安装 WSL扩展、C/C++扩展(in wsl)

让vscode进入wsl状态(左下角点击后选择),建立一个工作目录并让vscode打开该工作目录。

build 配置

打开一个cpp文件,菜单的 Terminal 打开 Configure Default Build Task...,选择g++ build active file

自动生成tasks.json,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "start g++ build active file",
"command": "mkdir -p ${workspaceFolder}/workspace/build && g++ ${file} -g -o ${workspaceFolder}/workspace/build/${fileBasenameNoExtension} && ${workspaceFolder}/workspace/build/${fileBasenameNoExtension}",
"args": [],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "shell",
"label": "g++ debug",
"command": "mkdir -p ${workspaceFolder}/workspace/build && g++ ${file} -g -o ${workspaceFolder}/workspace/build/${fileBasenameNoExtension}",
"args": [],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": false
}
},
]
}

这里把指令直接写在一行里了。

把相似的内容写了两遍,主要是第二个task用于debug的launch.json去调用。被调用的task省去了直接运行这一步,这样才能正常进入debug

设置了isDefault,则Ctrl+Shift+B就直接执行这个配置的build了。

这里指令全塞进配置里太长,也可以写成 “build and run” 脚本,在workspace下建立build_script.sh文件:

1
2
3
4
mkdir -p $1/build && \
g++ $2 -g -o $1/build/$3 && \
cd $1/build/ && \
./$3

这里用“cd” 是保证工作目录在build里,方便读写test.intest.out等文件。

然后用task.json的 command + args 调用(替换第一个task的两个地方):

1
2
"command": "${workspaceFolder}/workspace/build_script.sh",
"args": ["${workspaceFolder}/workspace", "${file}", "${fileBasenameNoExtension}"],

此时就可以Ctrl+Shift+B执行cpp了

(其实Run菜单里会发现 ctrl+f5 可以 Run Without Debugging,或许不配这一坨也行?)

debug 配置

wsl中安装gdb

1
sudo apt install gdb

菜单的 Run 打开 Add Configuration... 选择 C++ (GDB/LLDB)

自动生成launch.json,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"version": "0.2.0",
"configurations": [
{
"name": "run g++ debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/workspace/build/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ debug",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}

这里preLaunchTask要与 tasks.jsonlabel 对应,也就是对应了不带运行指令的task。

使用新的 C++ 特性

F1 菜单搜索选择 C/C++: Edit Configurations (UI),会生成一个c_cpp_properties.json文件,可以把

1
"cppStandard": "gnu++14",

改为

1
"cppStandard": "c++17",
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}

debug的glibc问题

1. 安装 glibc

1
2
3
sudo apt install glibc-source
cd /usr/src/glibc/
sudo tar -xvf glibc-*.tar.xz

2. 在 VSCode 文件夹下的launch.json中添加以下内容:

1
2
3
"sourceFileMap": {
"/build/glibc-xxxxx": "/usr/src/glibc"
}

修改 xxxxx 为报错提示中出现的glibc文件名:

1
2
3
"sourceFileMap": {
"/build/glibc-ZN95T4": "/usr/src/glibc"
}

使用

ctrl+shift+b 编译+运行,在vscode下方的terminal里进行数据交互

f5 debug,也在terminal里。其它debug快捷键点菜单的Run查看。