在 Linux 发行版下开发的最大问题是一堆 Windows 独占软件,即使 Deepin 做了许多努力,让 QQ、TIM、网易云音乐和其他一些常用应用可以运行,还是有很多好东西如 Onenote、微云同步客户端之类的无法运行,更别说微信这种虽然能运行但稳定性有很大问题的应用。碰巧,看到了 WSL(windows 下的 linux 子系统)在经过一年多更新后有了许多改进,尝试从 Deepin 搬回 Windows,并且要解决 Windows 下 Linux C 的开发环境配置。

需要注意的是,本方法所需要的 win10 版本必须在 15063 以上,也就是创意者更新之后的版本。你可以打开命令行输入 winver 查看自己的版本。关于 WSL 的安装请自行解决,具体选择哪个发行版没有很大的区别,我是用 ubuntu 18.04。另外,本文基于 VSCode 官方插件的文档

visual studio code 配置

首先 VSCode 需要安装微软官方 C/C++ 插件,如下图所示的插件。

VSCode安装官方插件

VSCode 一个不太好的地方是由于要对各种语言的支持,每个项目都要有单独的各种配置文件,所以每个 C 项目都要配置一遍配置文件,这里主要配置两个文件 launch.jsontasks.json,同时这两个文件应该在你项目文件夹的 .vscode 目录下:

develop-c-within-wsl-by-vscode-2.png

配置 launch.json 文件

launch.json 应该如下所示:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/mnt/c/works/clearn/test.o",//编译完成的文件
            "args": ["-fThreading"],
            "stopAtEntry": false,
            "cwd": "/mnt/c/works/clearn",//项目所在目录
            "environment": [],
            "externalConsole": true,
            "internalConsoleOptions": "openOnSessionStart",//调试时跳转到内部调试台
            "preLaunchTask": "build",//编译任务
            "windows": {
                "MIMode": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            },
            "pipeTransport": {
                "pipeCwd": "",
                "pipeProgram": "c:\\windows\\sysnative\\bash.exe",//通常不需要修改
                "pipeArgs": ["-c"],
                "debuggerPath": "/usr/bin/gdb"
            },
            "sourceFileMap": {
                "/mnt/c": "C:\\"//地址转换
            }
        }
    ]
}

这里详细说明一下,windows 系统的各盘符是映射在 linux 子系统的 /mnt 目录下的,如 C 盘就映射为 /mnt/c,所以上面涉及项目目录的都需要修改以符合你自身情况。有可能你会对 pipeProgram 不需要修改有疑问,WSL的启动文件不是在 C:WindowsSystem32 目录下面吗?官方的解释是 C/C++ 扩展本身是 32 位,所以需要特殊处理一下才能正常访问。

配置好 launch.json 文件,如果把其中的 preLaunchTask 去掉,其实你就已经可以用 WSL 的 gdb 调试文件了,只是在此之前你必须手动编译文件。因此才有了 tasks.json 文件,解决简单情况下的项目编译问题。

配置tasks.json文件

tasks.json如下所示:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "wsl gcc -g /mnt/c/works/clearn/test.c -o /mnt/c/works/clearn/test.o",
            "problemMatcher": [],
        }
    ]
}

注意这了 label 的名字应该和 preLaunchTask 所对应,这个配置文件的意义就是在调试前运行一条命令编译文件。这得益于 WSL 和 windows 命令行的互通,你完全可以在 Powershell 中执行绝大多数 linux 命令,只需在这之前加上 wsl 即可,而且这与你子系统的发行版无关。

现在两个文件都已经配置完毕,你已经可以正常使用 VSCode 在 WSL 环境下编写 C 语言程序了。正常运行、断点调试、单步运行这些都没有问题。

develop-c-within-wsl-by-vscode-3.png

单步调试提示找不到文件

在使用单步调试时提示“无法打开...:找不到文件(file:///build/glibc-OTsEL5/glibc-2.27/...”这类提示时,你要做的就是补全 glibc-2.27 目录下的文件,没有这些文件就 VSCode 的 C/C++ 插件就无法正常单步调试。你可以直接下载文件并解压到指定的目录,像我的就是在 C:/build/glibc-OTsEL5 目录。如果版本不对请到这里寻找对应版本。

最后

经过两天的折腾终于完成了从 Linux 迁移到 windows 的目标,不过对于我这种初学者,没有开发过大型 C 语言程序,感觉还有很多坑等着我。