Windows下VSCode集成MSYS2 GNU C编译环境

搭建好GNU C环境后,如何集成到VSCode呢? 这里一步步教你如何做。

第一步 设定PATH环境变量

MSYS2安装目录默认在C:\msys64,通过pacman安装的gcc、make、gdb都在目录 C:\msys64\usr\bin下。


设置环境变量,便于vscode找得到相关文件

第二步:安装vscode插件C++


为vscode安装C/C++扩展

第三步: 使用task.json、 launch.json配置vscode环境

vscode打开一个工作目录,在此工作目录下创建一个.vscode目录,在.vscode目录下创建task.json文件,lauch.json文件,分别如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make",
            "type": "shell",
            "command": "cd ${workspaceFolder}/code/c/  ; make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        },
        {
            "label": "gcc build active file",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"]
        }
    ]
}


{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GCC Buid and Debug C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\code\\c\\exe\\${fileBasenameNoExtension}.exe",
            "args": ["100" ,"1000", "1"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/code/c/",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "preLaunchTask": "make",
            "miDebuggerPath": "c:/msys64/mingw64/bin/gdb.exe",  // 根据您的安装路径调整
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "": "${workspaceFolder}\\code\\c\\src\\"
            }
        }
    ]
}


第四步 :编辑c代码、makefile

$ tree -L 1
.
├── exe
├── makefile
├── obj
└── src

在src中添加一个文件test_yaml.c,如下:

#include 
#include 
#include 
#include 
#include 
void read_yaml(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) {
        perror("Failed to open file");
        return;
    }

    yaml_parser_t parser;
    yaml_event_t event;

    // Initialize the parser
    if (!yaml_parser_initialize(&parser)) {
        fprintf(stderr, "Failed to initialize parser!\n");
        fclose(file);
        return;
    }

    yaml_parser_set_input_file(&parser, file);

    // Parse the YAML file
    while (1) {
        if (!yaml_parser_parse(&parser, &event)) {
            fprintf(stderr, "Parser error %d: %s\n", parser.error, parser.problem);
            break;
        }

        // Handle the events
        switch (event.type) {
            case YAML_MAPPING_START_EVENT:
                printf("Mapping start\n");
                break;
            case YAML_MAPPING_END_EVENT:
                printf("Mapping end\n");
                break;
            case YAML_SCALAR_EVENT:
                printf("Scalar: %s\n", event.data.scalar.value);
                break;
            case YAML_SEQUENCE_START_EVENT:
                printf("Sequence start\n");
                break;
            case YAML_SEQUENCE_END_EVENT:
                printf("Sequence end\n");
                break;
            default:
                break;
        }


        // Break on the end of the document
        if (event.type == YAML_STREAM_END_EVENT || event.type == YAML_NO_EVENT) {
            break;
        }
        // Free the event
        yaml_event_delete(&event);
    }

    // Cleanup
    yaml_parser_delete(&parser);
    fclose(file);
}
void print_data(const char *old_data, const char *new_data) {
    // 清屏
    printf("\033[H\033[J"); // ANSI 转义序列,清屏

    printf("Data:\n");

    // 获取数据的最大长度
    size_t max_length = strlen(old_data) > strlen(new_data) ? strlen(old_data) : strlen(new_data);

    for (size_t i = 0; i < max_length; i++) {
        // 检查 old_data 和 new_data 的每个字符
        char old_char = (i < strlen(old_data)) ? old_data[i] : ' ';
        char new_char = (i < strlen(new_data)) ? new_data[i] : ' ';

        if (new_char != old_char) {
            // 如果字符不同,标记为红色
            printf("\033[31m%c\033[0m", new_char); // 红色
        } else {
            // 如果字符相同,正常输出
            printf("%c", new_char);
        }
    }
    printf("\n");
}
int main() {
    const char *filename = "config.yaml";
    read_yaml(filename);
    return 0;
}

然后通过vscode,启动调试:按F5或者点选菜单RUN-start debug


在代码编辑视图中设置断点



会先执行make,然后进入调试。