VScode的两个json文件 (tasks.json、launch.json)针对C++构建任务

目录

    • **你能学到**
    • **前言**
      • **g++指令**
        • **单文件编译**
        • **多文件编译**
      • **tasks.json**
      • **launch.json**
    • **最后**

你能学到

  • 一些g++编译指令
  • tasks.json、launch.json在C++构建任务中的常用的键值对的含义

前言

本文仅讲解 tasks.json、launch.json 文件常用的地方,以 VScode 自动生成的两个 json 文件为例。

json是一种数据交换格式,不了解的自行百度。其实也没有太大必要了解很深,在本文中你只需知道它是用来存储配置信息的即可。
因为此格式便于计算机解析,大家都约定使用而已。换言之,只要你NB,设计的新格式合理,好用,没准大家都使用你的,那不大赚一笔?打住,想money想疯了-_-

在说这两个json文件之前,有必要先说说g++的编译指令。为什么呢?

tasks.json 顾名思义是用来定义任务的。使用 VScode 一键运行,通常执行的就是此文件中定义的任务。而现在我们的主要任务是构建 C++项目,编译出可执行文件 .exe。

用 VScode 来写代码,主要的无非就几个要求:

  • 编译C++项目文件
  • 调试程序
  • 代码错误提示

等,这些功能可由 GCC工具链 中的 g++、gcc、gdb 提供。
换言之,你只要下载了 GCC工具链(或者其他C++编译器),即便不用 VScode 也可以写 C++项目,然后使用相关指令调用 g++、gdb,进行编译、调试等(就像有人开玩笑说,大神都在用记事本写代码)。但是这样是很繁琐的,下面演示 g++ 相关的编译指令:


g++指令

本文重点在两个json文件,所以只是简单的讲解部分指令*(因为会用到,如果你已经会了自行跳过)* ,想要了解更多的自行百度。

常用的参数

  • -g : 生成 debug 版本程序,包含可供 gdb 使用的调试信息

如果不加此参数,那么无法生成能被调试的程序

  • -o : 指定输出文件的路径
  • -I : 指定头文件包含目录,用于搜索头文件
单文件编译
  • 初始状态

在这里插入图片描述

  • 输出指令调用 g++,编译 1.cpp,生成 1.exe

在这里插入图片描述

  • 运行 1.exe,成功

在这里插入图片描述

多文件编译
  • 项目结构如下

add.h 中为 add() 函数的声明语句,add.cpp 为其定义语句,现在在 main.cpp 中调用 add() 函数

在这里插入图片描述

  • 输入指令

因为 main.cpp 中导入的 add.h 不在当前目录,无法识别,因此需要使用 -I 参数指明其所在目录 (省略则默认为当前目录,比如下图中当前目录为 D:\10.cmake\demo\htf\text)

在这里插入图片描述


如果没有指明 add.h 所在目录,则会报错:

在这里插入图片描述


  • 运行,没有问题

在这里插入图片描述


tasks.json

作者的另外一篇文章(VScode配置C++环境)中说了自动生成 tasks.json 的方法,其内容如下:

在这里插入图片描述

  • type
    任务的类型。

VScode 内置任务类型为 shell、process。cppbuild 是为 C\C++ 插件提供的。(使用此类型,以便更好地与 C\C++ 插件集成,使用其功能)

  • tasks
    其后跟的 [ ] 中为对应的值,说明了任务是什么,怎么做。

既然是 tasks,那么也就是说任务可以有多个,在 [ ] 中,每个任务的相关信息在 { } 中,以 “,” 隔开。比如上述 tasks.json 只有一个任务 (红框中)

  • label
    既然可以有多个任务,那总该有唯一标识一个任务的键值,label 就是起此作用,接收一个 string。

  • command
    接收一个 string,用于在 shell 中 执行。比如之前用到的 g++

  • args
    接收一个 string数组,用于给 command 传递参数。像之前的 g++,书写调用指令需要指定参数。

  • 比如 g++ 1.cpp 指令,g++ 对应 command,而 g++ 后跟的参数对应 args
  • ${file} :是一种固定用法,表示取变量file的值
    file 是 VScode 已经定义好了的变量(就像 C++ 的预定义宏一样),表示当前打开的文件的路径,会在执行任务时自动替换。
    ${变量} 表示取变量的值
    想了解其他的预定义变量你可查看 VScode官方文档

当我们一键运行时,会发现终端出现如下情况(重点在 && 的后面跟的)
在这里插入图片描述
很显然,上述 tasks.json 的主要任务是 一键运行后,自动在终端执行 command + args

由于 g++ 所在路径已经加入环境变量,因此你可以将 指令 “C:\msys64\ucrt64\bin\g++.exe” 简单写为 “g++”
-fdiagnostics-color=always 表示 g++ 在输出错误信息时采用有颜色的字体输出。比如之前的没有写 -I 的那张图片的报错信息,有的单词被标红


  • options
    在执行任务时使用的命令选项,可省略

上述tasks.json中的 cwd 用于指明任务的执行目录,如果省略是默认是项目的根目录。

  • 因为 g++指令 中处理的是路径,存在相对路径,所以要指定一个合适的目录,保证之后的相对路径正确,绝对路径那就无所谓了。
  • ${fileDirname} 表示 取当前打开文件(file)的路径所在目录(dirname)
  • detail
    接收一个 string,用于描述任务详情,相当于注释

其他键值对目前用不到,不在过多说明。


所以其实重要的地方就两个:command、args。针对编译C++程序而言,二者提供了调用g++的指令 (这就是为什么要先说 g++ 指令的原因) 。下面来分析:
在这里插入图片描述

  • file:当前打开的文件对应的路径。
  • fileDirname (file dirname) :当前打开的文件对应的目录。
  • fileBasenameNoExtension:
    • Basename:路径中最后不包含文件路径分隔符的部分 (比如 ./file.h 为 file.h,C:\dir\file 为 file)
    • NoExtension:没有扩展名

合起来也就是 当前打开文件的无扩展名的文件名

所以,上述的 command + args = ‘g++ -g 当前打开的文件 -o 当前打开的文件.exe’,也就是说它只能处理单文件编译的情况。那么多文件的项目怎么办呢?无非还是修改 args,举例:

本人比较喜欢的一种格式,bin 目录用来装程序,inc 为头文件,src 为源文件。

在这里插入图片描述

如果用之前自动生成的tasks.json显然不合适,因为它只适合单文件编译,现在会是多文件,可如下进行修改

在这里插入图片描述

workspaceFolder:工作区目录 (在 VScode 中打开的目录,比如上图为 根目录TEXT)

  • 第一条红线:TEXT 目录下的 src 目录下的所有以 .cpp 结尾的文件 (*.cpp,通配符匹配路径)
  • 第二条红线:由于前一个是 -o 参数,所以指 输出文件为 TEXT 目录下的 bin 目录下的 main.exe

一个程序只对应一个.exe,在编译单文件的 json 文件中,我们使用的是当前打开的文件的文件名,而现在是直接指定程序名称为 main.exe

  • 第三条红线:由于前一个是 -I 参数,所以指 头文件包含目录 为 TEXT 目录下的 inc 目录
  • 第四条红线:因为上述从 args 的描述可知,此指令应该在 TEXT 目录下执行,才能确保路径正确

现在一键构建 (Ctrl + Shift + B)
在这里插入图片描述

运行程序,成功
在这里插入图片描述


launch.json

有必要注意的就三个

在这里插入图片描述

  • program:对应所生成的程序的路径,因为你要调试的程序就是它
  • externalConsole:默认情况下使用的是 VScode 内置的控制台。设为 true,那么将启用新的控制台
    1. false

在这里插入图片描述

    1. true

在这里插入图片描述

  • miDebuggerPath:调试器路径,以便 VScode 调用 gdb

最后

可以看到,VScode 自动生成的 tasks.json 只适用于单文件编译,但是在一个 C++ 项目中,大多采用头文件与源文件分离的情况,因为这样方便管理项目。

C++ 分文件写法不明白的可以见作者的另外一篇文章:c++ 分文件写法

在写的过程中你会发现一个重复性的工作:一个函数需要写两次,并进行一些增删,比如:

// 头文件
namespace std 
{

void fic(const string& s = "");

} 

// 源文件
namespace std 
{

void fic(const string& s)  // 删除默认参数
{		
		// ...
}	

}

代码少时没多大感觉,但较多时就比较麻烦,这里推荐作者自己写的一个命令行小工具(我称为 header_to_file),能够 读取头文件中的声明语句,自动生成定义语句,并输出到源文件中避免重复性工作,有兴趣的前往 header_to_file 了解。


文章参考VScode官方文档,如有错误,欢迎指正。
如果本文对你有用,欢迎点赞,或者分享给有需要的人(注明出处即可),谢谢。

<think>好的,我现在需要帮助用户理解VS Code中launch.jsontasks.json的用途和配置。首先,我得回顾一下自己关于这两个文件的知识,确保信息准确。根据提供的引用内容,用户已经给出了一些资料,我需要结合这些内容来组织答案。 首先,我应该明确区分这两个文件的作用。tasks.json用于配置任务,比如编译、构建等,而launch.json用于配置调试器的启动设置。用户可能想知道它们各自的功能以及如何配合使用。接下来,我需要考虑如何结构化回答,使其清晰易懂。可能需要分点说明每个文件的作用、配置项以及它们之间的区别。 然后,我需要检查是否有遗漏的重要信息。例如,引用中提到tasks.json中的label需要和launch.json中的preLaunchTask一致,这样才能在调试前先执行编译任务。这点很重要,应该包含在回答中。此外,不同编程语言(如Python、C++、Node.js)的配置示例可能对用户有帮助,但用户的问题比较概括,可能不需要具体到每种语言,但可以简要提到这些例子存在。 另外,用户可能需要了解如何生成这些文件。通常,在VS Code中,当用户开始调试或运行任务时,如果文件不存在,编辑器会提示生成默认的配置文件。这也值得提及,方便用户实际操作。 接下来,我需要确保回答符合用户的要求:结构清晰、使用中文、正确引用标注。引用中的四个来源需要正确对应到回答中的脚注。例如,引用[^1]和[^2]提到了两个文件的基本作用和区别,引用[^4]详细说明了它们如何联动。 可能存在的误区是用户混淆这两个文件的功能,比如认为launch.json负责编译,而实际上那是tasks.json任务。需要明确强调两者的分工:tasks处理构建步骤,launch处理调试启动。同时,解释preLaunchTask的作用,说明如何将两者连接起来。 最后,生成的相关问题需要围绕这两个文件的配置、区别、使用场景展开,帮助用户进一步探索。例如,如何配置特定语言的tasks.json,或者如何处理调试时的常见错误。 总结一下,回答的结构应该是:首先分别介绍launch.jsontasks.json的作用,然后说明它们的配置方法,接着讨论两者的区别和协作方式,最后附上相关问题。需要确保每个部分都简明扼要,并正确引用提供的资料。</think>### VS Code 中 `launch.json` 和 `tasks.json` 的作用及配置说明 #### 1. `tasks.json` 的作用与配置 - **用途**: 用于定义和管理**构建任务**,例如编译代码、运行脚本或执行命令行操作。它允许用户自定义自动化流程,例如用 `g++` 编译 C++ 代码或用 `python` 运行脚本[^1][^3]。 - **关键配置项**: - `"label"`:任务名称(需唯一),用于在命令面板中调用。 - `"type"`:任务类型(如 `"shell"` 表示在终端中执行)。 - `"command"`:具体执行的命令(如 `g++`)。 - `"args"`:命令参数(如 `["-g", "main.cpp"]`)。 - `"group"`:任务分组(如 `"build"` 归类为构建任务)。 **示例配置(C++ 编译任务)**: ```json { "version": "2.0.0", "tasks": [{ "label": "build_cpp", "type": "shell", "command": "g++", "args": ["-g", "main.cpp", "-o", "main"] }] } ``` #### 2. `launch.json` 的作用与配置 - **用途**: 用于配置**调试器参数**,定义如何启动和调试程序。例如指定调试环境(Python、C++)、设置断点或传递命令行参数[^2][^4]。 - **关键配置项**: - `"name"`:调试配置名称(如 `"Python Debug"`)。 - `"type"`:调试器类型(如 `"python"`、`"cppdbg"`)。 - `"request"`:调试模式(通常为 `"launch"` 或 `"attach"`)。 - `"program"`:待调试的程序路径(如 `"${file}"` 表示当前文件)。 - `"preLaunchTask"`:调试前需执行的任务名(需与 `tasks.json` 中的 `label` 一致)。 **示例配置(Python 调试)**: ```json { "version": "0.2.0", "configurations": [{ "name": "Python Debug", "type": "python", "request": "launch", "program": "${file}", "preLaunchTask": "run_python" }] } ``` #### 3. 两者的区别与协作 - **核心区别**: `tasks.json` 负责**构建或预处理**(如编译),而 `launch.json` 负责**调试运行**(如加载可执行文件或脚本)[^1][^4]。 - **协作方式**: 通过 `launch.json` 的 `"preLaunchTask"` 字段调用 `tasks.json` 中的任务,实现“先编译后调试”的流程[^4]。例如: ```json // launch.json { "preLaunchTask": "build_cpp" // 调用 tasks.json 中 label 为 "build_cpp" 的任务 } ``` #### 4. 文件生成与调试流程 - **生成方式**: - 首次调试时,VS Code 会根据项目类型自动生成模板文件。 - 也可通过命令面板(`Ctrl+Shift+P`)搜索 `Configure Tasks` 或 `Debug: Open launch.json` 手动创建。 - **典型流程**: 编辑代码 → 通过 `tasks.json` 编译 → 通过 `launch.json` 启动调试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值