【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格式概述

  • 举例
		{
            "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,重新编译生成的全流程

{
    "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格式概述

{
    "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几乎是一样的功能

# 设置 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会找不到它

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会,CES Asia 2025(第七届亚洲消费电子技术贸易展)即将盛大启幕。今年展会规模再度升级,预计将吸引超过500家全球展商参展,专业观众人数有望突破10万。除了聚焦人工智能、物联网、…

Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构

文章目录 前言use 用法1. 模块化与命名空间2. use 中 as 语法的使用3. as * 语法的使用4. 私有成员的访问5. use 中with默认值6. use 导入问题总结下一篇预告: 前言 在上一篇中,我们深入探讨了 Sass 中 import 语法的局限性,正是因为这些问题…

AI-Deepseek + PPT

01--Deepseek提问 首先去Deepseek问一个问题: Deepseek的回答: 在汽车CAN总线通信中,DBC文件里的信号处理(如初始值、系数、偏移)主要是为了 将原始二进制数据转换为实际物理值,确保不同电子控制单元&…

解锁前端表单数据的秘密旅程:从后端到用户选择!✨

😄 解锁前端表单数据的秘密旅程:从后端到用户选择!✨ 嘿,技术爱好者们!👋 你有没有在开发中遇到过这样的困惑:表单里的数据(比如图片附件、识别点 ID)从哪儿来的&#x…

【Linux】进程间通信 续

目录 管道的原理(匿名管道) 核心原理 站在内核的角度看管道的本质 接口 创建管道文件 代码示例 管道的特征 管道读写端的四种情况 管道的应用场景 命令行的管道。 使用管道实现进程池 初始化 控制子进程 退出 命名管道 命名管道的理解 …

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日,机器人行业龙头宇树科技(Unitree)在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司,聚焦智能机器人研发与销售,标志着宇树科技在华南市场的战…

AI-Ollama本地大语言模型运行框架与Ollama javascript接入

1.Ollama Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种…

SQLAlchemy系列教程:基本数据类型及自定义类型

在SQLAlchemy、Python SQL工具包和ORM中定义模型时,理解基本数据类型至关重要。本教程提供了在SQLAlchemy模型中有效使用内置基本类型的指南。 SQLAlchemy中的基本类型 SQLAlchemy支持一组与SQL数据库类型一致的基本数据类型。SQLAlchemy中的每种类型都为各种SQL类…

K8s The connection to the server 192.168.56.120:6443 was refused报错解决

虚拟机获取不到其他node节点的信息,通过使用docker ps -a 排查看到k8s的组件都是exited的状态,通过手动拉起docker 镜像id 起来之后,又变为exited的状态!!! 解决方法:重置k8s集群 使用 kubeadm…

随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)

随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.3.1 避免频繁更新(Update by Query的代价)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch数据更新与删除深度解析:2.3.1 避免频繁更新(Update by Query的代价)案例背景1. Update by Query的内部机制解析1.1 文档更…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中,全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构,企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例,其利用中台系统将分散在CRM、ERP及内部文档…

今天来介绍和讨论 AGI(通用人工智能)

首先介绍,AGI(通用人工智能)是什么? AGI(Artificial General Intelligence,通用人工智能)指的是能够像人类一样理解、学习、推理和解决广泛任务的人工智能系统。与目前的AI不同,AGI可…

计算机毕业设计SpringBoot+Vue.js乐享田园系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

navicat导出postgresql的数据库结构、字段名、备注等等

1、执行sql语句 SELECT A.attnum AS "序号",C.relname AS "表名",CAST ( obj_description ( relfilenode, pg_class ) AS VARCHAR ) AS "表名描述",A.attname AS "字段名称",A.attnotnull as "是否不为null",(case when A…

FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨

文章目录 一、DeepSeek:知识图谱与高效信息检索1. 核心技术2. 主要特点3. 应用场景4. 实际案例 二、Grok:通用人工智能框架1. 核心技术2. 主要特点3. 应用场景4. 实际案例 三、ChatGPT:聊天机器人与通用对话系统1. 核心技术2. 主要特点3. 应用…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了,下面创建多模块: 填好之后点击create 不删了,直接改包名,看自己喜欢 修改包名和启动类名: 打开ServiceApplication启动类,修改如下: …

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制,viso这个软件大部分技术人员都会使用,但是想要画的好看,画的科学还是比较难的,现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…