0%

VSCode: Windows下基于makefile的C++编译

目的

在Windows环境下使用makefile来编译C++,而不是在Linux系统中。虚拟机开得太烦了

准备材料

  • VSCode:官网下载就OK,没什么好说的
  • MinGW

MinGW配置

  • 下载压缩包:
    不应该直接点击Download Latest Version,不然下载下来的我也不知道怎么用….
    应该进入https://sourceforge.net/projects/mingw-w64/files/,然后滑到下面,点击url
    MinGW
    这时会得到一个名字为x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z的7z类型压缩包,这就是gcc-8.1.0,将其解压,得到包含MinGW的文件夹。
  • 配置环境变量
    XX用户变量和系统变量里的Path里添加入MinGW/bin的绝对路径。
    win+R后,输入cmd,打开terminal,输入g++或者gcc,如果出现以下log说明配置成功。最好重启一下
    1
    2
    3
    4
    5
    g++: fatal error: no input files
    compilation terminated.

    gcc: fatal error: no input files
    compilation terminated.

在VSCode中编写

首先要知道各种替换变量的意思。

1
2
3
4
5
6
7
8
9
10
${workspaceFolder} - the path of the folder opened in VS Code
${workspaceRootFolderName} - the name of the folder opened in VS Code without any slashes (/)
${file} - the current opened file
${relativeFile} - the current opened file relative to workspaceRoot
${fileBasename} - the current opened file's basename
${fileBasenameNoExtension} - the current opened file's basename with no file extension
${fileDirname} - the current opened file's dirname
${fileExtname} - the current opened file's extension
${cwd} - the task runner's current working directory on startup
${lineNumber} - the current selected line number in the active file

tasks.json用于在launch前执行任务,launch.json用于读取执行文件

  • 不使用第三方插件,且只编译单个cpp文件
    首先创建launch.json文件,方法如下所示,选择第一个即可
    1

    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
    {   //launch.json
    "version": "0.2.0",
    "configurations": [
    {
    "name": "g++.exe build and debug active file", //代表任务的名字
    "type": "cppdbg",
    "request": "launch",
    "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", //执行 经过task.json编译完后的exe文件??
    "args": [],
    "stopAtEntry": false, //选为true则会在打开控制台后停滞,暂时不执行程序
    "cwd": "${workspaceFolder}",//当前工作路径:当前文件所在的工作空间
    "environment": [],
    "externalConsole": false,//是否使用外部控制台
    "MIMode": "gdb",
    "miDebuggerPath": "D:\\tools\\compiler\\mingw64-posix-seh\\bin\\gdb.exe",
    "setupCommands": [
    {
    "description": "Enable pretty-printing for gdb",
    "text": "-enable-pretty-printing",
    "ignoreFailures": true
    }
    ],
    "preLaunchTask": "task g++" // must be same to the label in task.json.json
    }
    ]
    }

    然后点击F5,会弹出找不到task.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
    {   //task.json
    "version": "2.0.0",
    "tasks": [
    {
    "label": "task g++", // must be same to preLaunchTask in launch.json
    "type": "shell",
    "command": "g++",
    "args": [
    "'-Wall'",
    "'-std=c++17'", //使用c++17标准编译
    "'${file}'", //当前文件名
    "-o", //对象名,不进行编译优化
    "'${fileBasenameNoExtension}.exe'"
    //g++ -Wall -std=c++17 filename.cpp -o filename.exe
    ],
    "group": {
    "kind": "build",
    "isDefault": true
    },
    "problemMatcher": [
    "$gcc"
    ]
    }
    ]
    }

    然后有一个特别关键的点!不要让task.json或者launch.json处于active状态!!!否则会报下面错误:

    1
    2
    ...\.vscode\tasks.json: file format not recognized; treating as linker script
    ...\.vscode\tasks.json:1: syntax error

    上面的意思是把task.json文件当做cpp源文件来编译了,因为上面的args里面的${file}代表当前处于active状态的文件!正确的做法是下面这样:
    2
    最后直接Run就OK了~

  • 不使用第三方插件,且编译多个cpp文件
    此时就需要学习使用makefile或者cmake了,然后把tasks的命令改成调用make等。

Reference

VScode tasks.json和launch.json的设置
Compilling C++ in visual studio code on Ubuntu
Visualstudio Code Doc: Using GCC with MinGW
各种替换变量的意思
Visual Studio Code 如何编写运行 C、C++ 程序?