【vscode】一键编译运行c/c++程序

概述

虽然我这里使用CMake,但是它只是一个用于编译生成可执行文件的工具,完全不影响将工具换成g++,gcc等,这套配置是完全通用的

  1. 右上角一键编译运行的内部流程
  2. task.json格式概述
  3. launch.json格式概述
  4. CMake格式概述
  5. 攒起来,组合成通用开发环境

一键编译运行的内部流程

  1. 点击运行 C/C++ 文件(或按下F5)
  2. vscode调用launch.json挑选调试器、根据参数配置运行环境
  3. 调用task.json生成可执行文件
  4. 启动调试器,加载用task.json生成的可执行文件
  5. 开始调试

task.json格式概述

  • 举例
json 复制代码
		{
            "label": "CMake: Build",
            "type": "shell",
            "command": "cmake",
            "args": ["../"],
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "dependsOn": ["create"]
        },

概述

  1. task.json中,在 "tasks": [ ] 方括号中的,每一组用 { } 括起来"东西",都是一个task,也是这个文件真正要去执行的事
  2. 将一系列task组合起来,就可以实现一个完整的目标(有点类似于shell脚本,只不过shell以指令为单位,task.json以任务为单位)

具体变量解释

  1. "label" 表示当前任务的名称,
  2. "type" 表示当前任务的类型,不同类型对应了该任务不同的执行的方式
    • "shell",在终端执行;
    • "process",在一个新的进程中直接执行,常用于避免 shell 特定的行为或环境变量影响
    • "customExecution",使用一个扩展来提供自定义的任务执行逻辑
    • "npm",专门用于执行 npm 脚本
  3. "command" 表示执行时要使用的指令
  4. "args" 表示执行指令时要输入的参数
  5. "cwd" 表示执行该任务的目录
  6. "dependsOn" 表示该任务依赖于其他什么任务,填入需要在此之前执行完的任务名称

完整task.json

实现了一个完整的清除build,重新编译生成的全流程

json 复制代码
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "clean",
            "type": "shell",
            "command": "rm",
            "args": ["-r", "build"],
            "options": {
                "cwd": "${workspaceFolder}"
            }
        },
        {
            "label": "create",
            "type": "shell",
            "command": "mkdir",
            "args": ["build"],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "dependsOn": ["clean"]
        },
        {
            "label": "CMake: Build",
            "type": "shell",
            "command": "cmake",
            "args": ["../"],
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "dependsOn": ["create"]
        },
        {
            "label": "make",
            "type": "shell",
            "command": "make",
            "args": [],
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "dependsOn": ["CMake: Build"]  // make 依赖 CMake 生成 Makefile
        },
        {
            "label": "build",
            "dependsOn": ["clean", "create", "CMake: Build", "make"],
            "dependsOrder": "sequence"
        }
    ]
}
  • 重点解释build任务
    • 相当于将之前的所有任务都攒起来,变成一个完整的处理流程,launch只需要调用这个build任务,就可以完成一次清理并重建
    • 最后一个属性"dependsOrder": "sequence",指定了依赖任务的执行顺序。表示所有前置任务将按照它们在 "dependsOn" 数组中出现的顺序依次执行。

launch.json格式概述

json 复制代码
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "CMake Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/build/bsp",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "/usr/bin/gdb",
            "preLaunchTask": "build"
        }
    ]
}

概述

launch很简单,只干三件事:

  1. 定义如何启动调试器(GDB)
  2. 调试前的构建任务(preLaunchTask)
  3. 调试目标程序的位置

具体变量解释

  • name : "CMake Debug"
    作用: 调试配置的名称,显示在 VS Code 调试器下拉列表中。

  • type : "cppdbg"
    作用: 指定调试器类型为 C++ Debugger

  • request : "launch"
    作用: 表示启动一个新的程序进行调试(而非附加到已运行的进程)。

  • program : "${fileDirname}/build/bsp"
    作用 : 指定要调试的可执行文件路径。

  • stopAtEntry : false
    作用 : 是否在程序入口(如 main 函数)自动暂停。设为 false 表示直接运行程序。

  • cwd : "${workspaceFolder}"
    作用: 调试程序的工作目录,此处设为工作区根目录。影响程序的文件读写路径(如相对路径的文件访问)。

  • externalConsole : false
    作用 : 是否在外部系统终端中运行程序。设为 false 表示使用 VS Code 内置终端。

  • MIMode : "gdb"
    作用: 指定底层调试器为 GDB(GNU Debugger)。

  • setupCommands
    作用: 调试器启动时执行的初始化命令。通常我们不需要反汇编的,将自动生成的反汇编部分删除即可

    • text: 向 GDB 发送 -enable-pretty-printing 命令,启用结构化数据(如 STL 容器)的友好显示。
    • ignoreFailures: 即使命令执行失败,也不终止调试会话。
  • miDebuggerPath : "/usr/bin/gdb"
    作用: 显式指定 GDB 的路径。缺省时,VS Code 会从系统环境变量中查找 GDB。

  • preLaunchTask : "build"
    作用 : 在启动调试前自动执行 tasks.json 中定义的 build 任务(如编译代码)。在上面的task.json中已经着重介绍过 build 任务了。

CMake格式概述

CMake本质就是告诉编译器如何编译(生成makefile)

无非就是用相对简单的方式,管理结构比较复杂的程序,然后在不同平台的兼容性上相对好一些,和c_cpp_properties.json几乎是一样的功能

CMakeLists 复制代码
# 设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称和编程语言
project(BSP_Project C)

# 添加头文件目录
include_directories(${CMAKE_SOURCE_DIR})

# 设置可执行文件输出目录(可选)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)

# 添加可执行文件
add_executable(bsp 		# 生成的可执行文件的名称
    main.c 				# 两个用于生成可执行文件的源文件
    bsp.c
)
target_include_directories(bsp PUBLIC ${CMAKE_SOURCE_DIR})

需要注意的是,生成的可执行文件名称,一定要和launch中的program对应,不然launch会找不到它

相关推荐
程序员Linc14 分钟前
用OpenCV写个视频播放器可还行?(C++版)
c++·opencv·音视频·opencv 4.11
决斗小饼干37 分钟前
并发编程知识总结
c++
九溪弥烟、1 小时前
VSCode 配置优化指南
ide·vscode·编辑器
Andlin1 小时前
《CMakeList 知识系统学习系列(三):函数和宏》
c++
Forget the Dream1 小时前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式
️Carrie️2 小时前
10.2 继承与多态
c++·多态·继承
Nicole Potter2 小时前
内存泄漏出现的时机和原因,如何避免?
c++·游戏·面试·c#
却道天凉_好个秋2 小时前
c++ 嵌入汇编的方式实现int型自增
开发语言·汇编·c++
想喝冰拿铁2 小时前
vscode的markdown插件
ide·vscode·编辑器
tyler-泰勒3 小时前
c++:迭代器的失效
开发语言·c++