在VSCode上使用WSL进行Linux开发

0x01 前言

Visual Studio Code 是一个跨平台的开源代码编辑器,因为有微软爸爸的后台,其相关的生态可以说是很庞大了,该支持的都有,可拓展性也很强,我使用一段时间之后体验极佳。

VSC

然后呢因为 OI/ACM-ICPC 系列竞赛的评测机都是 Linux 环境的,因此我就想用 Windows Subsystem for Linux 来做日常的练习开发平台,Linux 上的包管理比Windows强大到不知道哪儿去了,虽然 Windows 上有 Visual Studio 这个宇宙最强IDE,但是在算法竞赛实践上还是太麻烦了一点。而 WSL 的出现即可以解决不同平台的 C++ 表现不同的问题,又可以丝滑地体验 Linux 的终端环境,最最最重要的是 VSCode 太好看了啊!那么如何用Windows上的VSCode来与WSL交互呢?

0x02 比较蛋疼的方法-利用VSCode的工具和设置

这个方法试图将WSL侧的工具链(bash、gcc、gdb、git等)全部整合到Windows侧的VSCode,下面一步一步来。

Terminal使用WSL

首先我们需要安装 WSL,这里直接贴一个教程链接吧 https://www.cnblogs.com/JettTang/p/8186315.html ,如果你已经安装好了,那可以直接略过这里。接下来的教程假设我们使用的是 Ubuntu 系统。

安装完成后,进入 Bash ,输入以下指令,将我们开发C/C++常用的工具安装到子系统中

sudo apt update
sudo apt install git build-essential gdb

接下来在 Visual Studio Code 设置中新增如下内容:

{
    "terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe"
}

如果要调用 32 位进程,需要配置使用 Sysnative:C:\\Windows\\sysnative\\bash.exe
如果 VSCode 是 64 位版本,可以直接使用:C:\\WINDOWS\\System32\\bash.exe 或者 C:\\WINDOWS\\System32\\wsl.exe

重启 VSCode 终端,唤起的终端环境就是 WSL 的 shell 环境了。

WSL的Git

这里的配置是为了让 VSCode 使用 WSL 内的 git 进行版本控制。这里我们使用 wslgit 这个小工具来让 VSCode 直接调用 WSL 的 git 而不是默认的Windows的 git。

在 wslgit 的 Release 页面下载,将 wslgit.exe 文件放到一个合适的地方,并复制完整的路径,在 VSCode 设置中将这个设置调整为自己的wslgit:

{
    "git.path": "X:\\path\\to\\wslgit.exe"
}

安装与配置cpp-tool

首先前往 VSCode 的 Extentions(Ctrl + Shift + X),搜索 C/C++ 安装 C/C++ for Visual Studio Code 插件,这个插件是微软官方开发的,可靠有保证,同样也是开源的。

C/C++ Extention

安装并激活插件后,同时打开一个工作区文件夹,例如我使用 D:\OneDrive\TheRoadToACM ,按 F1 ,输入 C/Cpp: Edit Configurations (其实不用输完,应该会自动选择的) 然后回车,你会发现它自动打开了 c_cpp_properties.json, 将文件内容替换为以下内容:

{
    "configurations": [
        {
            "name": "WSL",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [ "LOCAL" ],
            "cStandard": "c11",
            "cppStandard": "c++14"
        }
    ],
    "version": 4
}

tasks.json配置

接下来,在 $工作区文件夹$/.vscode/ 下面新建一个 tasks.json , 加入如下内容:

{
    // tasks.json
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",
            "command": "g++",
            "args": [
                "-g",
                "-Wall",
                "-std=c++14",
                "/mnt/替换为工作区文件夹的路径/${fileBasename}", 
                //这里使用Linux子系统的目录结构,例如C盘根目录在/mnt/c/ ,下面的路径同理
                "-o",
                "/mnt/替换为工作区文件夹的路径/a.out",
                //这个是输出的二进制文件路径
                "-D LOCAL"
            ],
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            },
            "type": "shell",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "silent",
                "focus": true,
                "panel": "shared"
            }
        },

        {
            "label": "Run",
            "command": "/mnt/替换为工作区文件夹的路径/a.out",
            //刚才设置的输出二进制文件路径
            "type": "shell",
            "dependsOn": "Build",
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true
            }
        }
    ]
}

这样我们就能用 VSCode 的 Tasks 功能来调用 WSL 的 GCC/G++ 编译器并运行编译好的程序了。这里为了方便直接将运行程序的任务与 Tasks: Run Test Task任务关联起来了,可以在F1里面找到这个指令并执行,不过每次要这样还是有点麻烦,我们可以直接按 F7 来 运行Test Task。

快自己动手写一个Hello World试试吧!

在WSL上调试

只运行当然不够啊,万一想调试怎么办?VSCode 本来就有非常强大的调试功能,那肯定要用上啦。

首先在 工作区文件夹/.vscode/ 下面新建一个 launch.json ,修改为以下内容:

{
    // launch.json
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GDB Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/mnt/替换为工作区文件夹的路径/a.out",
            "args": ["-fThreading"],
            "stopAtEntry": false,
            "cwd": "/mnt/替换为工作区文件夹的路径/",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ],
            "pipeTransport": {
                "pipeCwd": "",
                "pipeProgram": "c:\\windows\\system32\\bash.exe", //wsl的路径
                "pipeArgs": ["-c"],
                "debuggerPath": "/usr/bin/gdb"
            },
            "sourceFileMap": {
                "/mnt/c": "c:\\",
                "/mnt/d": "d:\\"
            },
            "preLaunchTask": "Build"
        }
    ]
}

然后,就可以使用 VSCode 进行调试啦, 打开一段程序,添加断点,按F5即可开始调试,F10跳到下一行,也可以在旁边添加 Watch 来查看变量。

C/C++ Debug

稍微简单点-在WSL下使用图形界面

这个我也没用过,见 https://spencerwoo.com/dowww/4-GUI

配置好之后直接在 Ubuntu 桌面上开浏览器下载 VSCode 然后就可以运行了。。。

是不是很简单?

本页面的全部内容在 CC BY-NC-SA 4.0 协议之条款下提供,附加条款亦可能应用
本文链接:https://www.copperion.com/2018/vscode-cpp-wsl/