在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语言程序,感觉还有很多坑等着我。