Windows 下 VSCode 的 C/C++ 开发

1 开发环境的搭建

1.1 环境配置

VSCode 下开发 C/C++,主要需要 mingw-w64(GCC fpr Womdpws 64 & 32 bits)、Cmake 工具(选装)

MinGW 安装

MinGW普通安装方法,官网安装,但是下载有点慢,而且需要自己选择包,我不是很会选,推荐第二种方法。

首先进入 mingw 官网,下载安装包 (安装方法很多,其中 VSCode 官方推荐使用 msy2 工具 安装)

双击exe文件进行安装,不过注意安装位置,后面需要配置环境变量

下载的有些慢

msys2 安装方法 这种方法最为方便,但是安装位置基本不要改动
进入 msys2官方,按照 msys2 的方法进行安装即可。
不过在 msys2 第六步中指令,需要替换为 VSCode 官方的指令,否则部分包不存在

CMake 安装

同理,进入 CMake 官网,下载文件 下载链接
需要注意是 Binary distributions 里面的文件,(source 里面是源文件)


同样解压之后注意,安装的路径。

环境变量设置

文件安装完毕后,需要将一下的路径设置环境变量中,同时注意

环境变量在设置 => 系统 => 关于 => 高级系统设置 中,不再赘述。

power shell 查看环境变量设置效果

1.2 VSCode 插件

需要安装插件如下

  • C/C++。 C和C++的插件,用于 Debug 调试和代码浏览。
  • CMake。对CMake 语言的支持。
  • CMake tools。对CMake的拓展支持。

直接在VSCode 插件库中进行 install 即可,如下

2 代码的实战演练

2.1 基于 g++ 命令

任何 IDE 的背后,肯定都是使用了咱们之前配置的 gcc, g++, gdb 的命令,只不过是将其进行了封装,以图形界面操作的方式展示给了用户,这里我们以最底层的命令行操作来进行展示。

  • 命令1 g++ 编译单文件main.cpp
g++ main.cpp -o main.out
  • 命令2 g++编译多个文件main.cpp, swap.cpp
g++ main.cpp swap.cpp -o main.out
  • 命令3 g++,编译文件,并生成调试信息,在命令1,命令2的基础上加入-g参数
g++ main.cpp swap.cpp -g -o main.out

编译单文件并调试

main.cpp

#include <cstdio>
#include <iostream>

using namespace std;

void xyg_swap(int &x, int &y) {
    int t = x;
    x = y;
    y = t;
}

int main()
{
    int x = 3, y = 4;

    printf("before swap: \n\tx=%d, y=%d\n", x, y);

    xyg_swap(x, y);

    printf("after swap: \n\tx=%d, y=%d\n", x, y);
    return 0;
}

首先,选择在 vscode 中打开终端,进入当期工作目录的 powershell 下

PS F:\projects\vscode\test\blog_project> g++ .\main.cpp -o main.exe
PS F:\projects\vscode\test\blog_project> ./main
before swap: 
        x=3, y=4
after swap: 
        x=4, y=3

然后使用 -g 带有调试信息的编译参数,生成 main.exe 文件,而后debug

PS F:\projects\vscode\test\blog_project> g++ -g .\main.cpp -o main.exe 
PS F:\projects\vscode\test\blog_project> ./main
before swap: 
        x=3, y=4
after swap:
        x=4, y=3

正常运行,下面直接使用 vscode debug 功能

可以看到项目中多出了几个文件

修改 launch.json 文件,使之运行我们的 main.exe。更换了 "program" 参数,并注释 "preLaunchTask"

{
    "configurations": [
        {
            "name": "C/C++: g++.exe build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            // "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "program": "${fileDirname}\\main.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\CodingSoftware\\c++_env\\MinGW\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            // "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ],
    "version": "2.0.0"
}

编译多文件并调试

该步骤主要是按照 g++ -g main.cpp swap.cpp -o main.exe 的指令规范,修改 task.json 文件,
main.cpp

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include "swap.h"

using namespace std;

void my_swap(int &x, int &y) {
    int t = x;
    x = y;
    y = t;
}

int main()
{
    int x = 0, y = 1;
    scanf("%d%d", &x, &y);

    printf("before swap\n");
    printf("\tx=%d, y=%d\n", x, y);

    xyg_swap(x, y);

    printf("after swap\n");
    printf("\tx=%d, y=%d\n", x, y);
    return 0;
}

swap.cpp

void xyg_swap(int &x, int &y) {
    int t = x;
    x = y;
    y = t;
}

tasks.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "swap.cpp", // 主要修改点
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

launch.json

{
    "configurations": [
        {
            "name": "C/C++: g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",  // 注意和 tasks.json 文件中的 label 属性对应
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ],
    "version": "2.0.0"
}

当然,你也可以手动实现 tasks.json 文件的操作, g++ -g main.cpp swap.cpp -o main.exe,而后,只需要将 launch.json 文件中的 "preLaunchTask" 注释掉即可

至此,你已经掌握了 g++ 命令和 vscode 编译 c++ 项目的基本使用方法

2.2 基于 cmake 命令

但是,当你遇到大型 C++ 项目的时候,各种 .cpp .h 文件关系过于复杂,按照传统的项目方法,你需要定义一个 MakeFile 文件
等待后序补充

2.3 配置 json 文件

等待后序补充

参考文献

BiliBili视频链接
VSCode 官方文档

posted @ 2022-09-11 16:22  lucky_light  阅读(324)  评论(0编辑  收藏  举报