在VScode下配置C/C++环境(tasks.json、launch.json、c_cpp_properties.json)

文章目录

  • 1. tasks.json、launch.json配置文件中参数(属性)的说明
  • 2. tasks.json介绍
  • 3. launch.json介绍
  • 4. 直接生成tasks.json、launch.json配置文件的另外一种方式
  • 5. c_cpp_properties.json介绍
  • 6. 运行多个C/C++文件
  • 7. 命令行方式编译C++

1. tasks.json、launch.json配置文件中参数(属性)的说明

  首先我们创建了一个code项目,然后在code文件夹下分别建立了day1和day2两个目录(文件夹),最后在day1和day2文件夹下分别创建hello.cmain.cpp两个文件,code项目的组织结构如下图1所示。在VScode中,默认情况下code文件夹是一个workspace(工作区、工作空间)。

在这里插入图片描述

图1 code项目的组织结构

  下面,我们基于上面code项目的组织结构对tasks.json、launch.json配置文件中的参数(属性)进行说明。(以hello.c文件为例)

(1)${workspaceFolder}:表示当前workspace(工作区、工作空间)文件夹的路径,也即当前项目绝对路径。例如:D:\code,code就是一个工作区。
(2)${fileDirname}:表示当前打开文件的绝对路径,但不包括文件名。例如打开hello.c文件,该文件所在的绝对路径(${fileDirname})为:D:\code\day1,day1就是hello.c文件的目录。
(3)${workspaceFolder}/**:表示当前workspace(工作区、工作空间)文件夹的路径,而且还会递归搜索所有子目录。例如:当前项目的绝对路径为D:\code,不仅要搜索code文件夹,还会递归搜索code的所有子目录(子文件夹)。
(4)${workspaceRootFolderName}:表示workspace(工作区、工作空间)文件夹名字,也就是当前项目所在文件夹名字,例如code文件夹。
(5)${file}:表示当前打开的文件,指的是当前活动文件。包括绝对路径,文件名,文件后缀名。例如:D:\code\day1\hello.c
(6)${fileBasename}:当前打开含有后缀的文件名,不包括路径。
(7)${fileBasenameNoExtension}:表示当前打开的文件名,但不包括路径和后缀名。
(8)cwd(current working directory):当前工作目录,它是操作系统当前正在运行进程所在的目录。在命令行界面(比如,cmd)中,用户输入命令时,默认情况下会在cwd下执行。

更多命令参考:变量参考
参考文章
最新VS code配置C/C++环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake
(上面这篇文章介绍的比较详细,我下面总结的大部分内容都摘抄于该文章,非常感谢该博主)

2. tasks.json介绍

  tasks.json在编译时用的到,配置tasks.json文件的步骤(下面以hello.c文件为例):

  1. 首先运行hello.c文件(点击右上角的运行图标),再点击"C/C++:gcc.exe生成和调试活动文件",如图2所示。
    在这里插入图片描述
图2 运行当前活动文件
  1. 经过步骤1,在工作区code文件夹下可以生成一个.vscode\tasks.json文件,如下图3所示。除了tasks.json配置文件外,launch.json、c_cpp_properties.json配置文件也放在.vscode文件夹下。
    在这里插入图片描述
图3 产生的tasks.json文件
  1. tasks.json文件配置内容如下。在配置路径时只能使用\\/隔开目录。
{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活动文件","command": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gcc.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin"// "cwd": "${fileDirname}":有时候"cwd"的值为:"${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "调试器生成的任务。"}],"version": "2.0.0"
}

下面对tasks.json文件中的参数进行介绍:
(1)“type”:任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。
(2)“label”:任务标签(标记),也称任务名称,对应的值可以更改。tasks.json文件中label对应的值要和launch.json里面"preLaunchTask"对应的值一致。
(3)“command”:编译器及其路径。.c用gcc.exe编译器(C语言编译器),.cpp用g++.exe编译器(C++语言编译器),还可以是Cmake、make。
(4)“args”:方括号里面是传给gcc命令或g++命令的一系列参数,用于实现某些功能。
(5)“-g”:生成和调试有关的信息,launch.json会用到这些信息。如果少了这个"-g",生成的可执行文件就不能被调试了。
(6)“${file}”:编译当前打开的.c(或.cpp)文件,此处是hello.c文件。
(7) “-o”:指定编译的输出,windows系统下输出.exe文件。
(8)"${fileDirname}\\${fileBasenameNoExtension}.exe":表示在当前工作目录下生成一个与源代码同名的可执行文件,即在day1目录下生成一个hello.exe文件。如果将${fileDirname}修改为${workspaceFolder},那么就会在当前工作区code文件夹下生成一个hello.exe文件。也可以在工作区code文件夹中建立一个bin文件夹,接着将编译后输出的可执行文件路径设置为:"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe"。同时需要将launch.json文件中的参数"program"设置为:"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe"。那么就会在bin文件夹下生成一个可执行文件(.exe)。

3. launch.json介绍

   launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。

  1. 单击左侧栏运行和调试图标,再点击创建launch.json文件选项,会在右侧出现选择调试器菜单。接着单击C++(GDB/LLDB),这里的GDB、LLDB是可以作为C/C++的调试器(debugger)。具体实现过程如下图4所示。
    在这里插入图片描述
图4 launch.json文件生成过程
  1. 执行完步骤1,会在工作区code中的.vscode文件夹里面生成一个launch.json配置文件。这里的launch.json文件是首次配置,默认为空,如下图5所示。
    在这里插入图片描述
图5 launch.json文件中的内容
  1. 在configurations的中括号里进行配置launch.json文件,配置的内容如下。
{"configurations": [{"name": "C/C++: gcc.exe 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin",// 有时候 "cwd"为: "${fileDirname}"或"${workspaceFolder}""environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gdb.exe","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "C/C++: gcc.exe 生成活动文件"}],"version": "2.0.0"
}

下面对launch.json文件中的参数进行介绍:
(1)“name”:自定义命名运行与调式的名称,将在左侧运行和调试的菜单中显示名称,如下图6所示。
在这里插入图片描述

图6 运行与调式的名称

(2)“type”:配置类型,调试器类型,cppdbg为C/C++的调试类型。
(3)“request”:配置请求类型,可以为launch(启动)或attach(附加)。
(4)“program”:在windows系统下需要进行调试的可执行文件(.exe文件)及其路径,应该与tasks.json编译后输出的可执行文件(.exe文件)及其路径一致。
(5)“args”:程序调试时传递给程序的命令行参数,一般设为空即可,这里提到的程序实际就上面的.exe文件。
(6)“stopAtEntry”:设为true时程序将暂停在程序入口处,一般设置为false。
(7)“cwd”:当前工作目录(路径)。
(8)“environment”:添加到程序的环境变量。
(9)“externalConsole”:true开启外部控制台窗口,false会使用vscode内部控制台窗口。
(10)“MIMode”:指示 MIDebugEngine 要连接到的控制台调试程序,允许的值为 “gdb”、“lldb”。这里使用gdb进行调试。
(10)“miDebuggerPath”:调试器debugger文件及其路径,这里是调用gdb调试器的路径。
(11)“preLaunchTask”:运行和调式前要启动的tasks任务,也即要启动的编译任务,任务名要和tasks.json里面的"label"值对应一致。

4. 直接生成tasks.json、launch.json配置文件的另外一种方式

  1. 点击右上方的添加调试配置按钮,接着再点击"C/C++:gcc.exe生成和调试活动文件",如下图7所示。
    在这里插入图片描述
图7 生成tasks.json、launch.json配置文件的过程
  1. 经过步骤1可以在.vscode文件夹中生成tasks.json、launch.json这两个配置文件,如下图8所示。
    在这里插入图片描述
图8 .vscode文件夹中的tasks.json、launch.json文件

5. c_cpp_properties.json介绍

   c_cpp_properties.json文件主要是对编辑环境的配置,是针对IntelliSense(智能感知)引擎的有关配置。intelliSense是各种代码编辑功能的通用术语,包括:代码补全、参数信息提示、快速信息描述提示和成员列表提示等,因而,intelliSense也称为代码提示(code hinting)。
   当我们装了C/C++编译器,并在vs code中安装了具有调试功能的C/C++扩展(Extension)后,会自动产生默认的c_cpp_properties.json配置。上面tasks.json、launch.json文件配置完后,我们就能运行C/C++程序了,此时采用默认的c_cpp_properties.json配置。一般情况下,我们可以不用配置c_cpp_properties.json,按上面步骤配置完tasks.json、launch.json后就可以运行代码了。但如果我们要指定头文件(.h文件)、库的位置,那么就需要配置c_cpp_properties.json、tasks.json文件。
   我们可以通过快捷键Ctrl+Shift+P打开命令面板,接着输入关键词C/C++编辑配置 ,之后会弹出C/C++编辑配置(JSON)和C/C++编辑配置(UI)两种选项,如下图所示。
在这里插入图片描述
(1)C/C++编辑配置(JSON)是c_cpp_properties.json文件形式的设置,单击该选项就会在.vscode文件夹下生成一个c_cpp_properties.json配置文件;
(2)C/C++编辑配置(UI)可以通过一个可视化界面来手动设置,当我们单击 C/C++编辑配置(UI) 选项时,就会自动在.vscode文件夹下生成一个c_cpp_properties.json配置文件。我们可以C/C++配置 菜单下来制定编译器路径,如下图所示。
在这里插入图片描述
(3)c_cpp_properties.json配置文件的默认配置如下:

{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"cStandard": "c17","cppStandard": "gnu++14","intelliSenseMode": "windows-gcc-x64","compilerPath": "D:/AppInstall/GCCAPP/mingw64/bin/gcc.exe"}],"version": 4
}

文件中的参数介绍如下:

  • “name”:名称。操作系统根据这个名称识别对应的属性配置,windows系统:Win32;Linux系统:Linux;macOS系统:Mac。
  • “includePath”:头文件路径。以便IntelliSense(智能感知)引擎的搜索。
  • "${workspaceFolder}/**":当前项目所在根目录并递归搜索子目录,也就是当前工作区文件夹的路径(例如:D:\code),而且还会递归查找其所有的子目录。
  • “defines”:IntelliSense(智能感知)引擎在分析文件时要使用的预处理器定义列表。
  • “cStandard”:用于IntelliSense(智能感知)引擎的c标准(版本)。
  • “cppStandard”:用于IntelliSense(智能感知)引擎的c++标准(版本)。
  • “intelliSenseMode”:IntelliSense(智能感知)的模式。
  • “compilerPath”:根据该路径查询编译器(gcc.exe、g++.exe),以便启用更加准确的IntelliSense(智能感知)。这里并不是调用编译器,真正启用编译器编译的是在tasks.json文件里

6. 运行多个C/C++文件

   按照上面步骤配置好tasks.json、launch.json文件后,我们就可以编译运行C/C++程序,只不过此时只能编译运行一个C/C++源文件。如果我们编写的主程序需要调用其它文件的函数,也就是要编译多个文件时,task.json文件中的"${file}"是不能实现多文件编译的,因为"${file}"表示当前打开的C/C++源文件,也就是说只能编译一个C/C++源文件。那这时候该咋办啊,我好怕怕啊,救命啊。不要慌不要急,下面给出解决方案。
  我们以图1 code项目的组织结构为基础,在工作区code文件夹的day1文件夹下创建hello.c、func.c、sum.h这个文件,如下图9所示。
在这里插入图片描述
其中hello.c文件为

#include <stdio.h>
#include "sum.h"
int main()
{printf("hello C");int s = sum(1,2);printf("sum = %d", s);return 0;
}

func.c文件为

int sum(int a, int b){return a+b;
}

sum.h文件为

int sum(int a, int b);

  解决方案的中心思想是:你在编译的时候用到几个C/C++源文件,那么在tasks.json配置文件中就添加相应数量的C/C++源文件路径C/C++源文件路径添加的位置在tasks.json文件下"args"参数中,即:

"args": [	     ..."-g",//在"-g"和"-o"之间添加编译时用到的C/C++源文件路径"-o",...]

(1)第一种方法:将"${file}"、"${fileDirname}\\func.c"添加进去。"${file}"表示当前打开的活动文件,也就是hello.c文件路径;"${fileDirname}\\func.c"表示func.c文件路径。
(2)第二种方法:将"${file}"、"${workspaceFolder}\\day1\\func.c"添加进去;"${workspaceFolder}\\day1\\func.c"表示func.c文件路径。
(3)第三种方法:前两种方法需要手动地将每个源文件路径添加进去,太麻烦了。所以可以将"${fileDirname}\\*.c"添加进去,此命令相当于把所有后缀名为.c的文件路径都添加进去。
(4)如果是C++源文件,将后缀名".c"换成".cpp"即可。
(5)tasks.json配置文件中的内容更改如下,launch.json保持不变。

{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活动文件","command": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gcc.exe","args": ["-fdiagnostics-color=always","-g",// 第一种方法:"${file}","${fileDirname}\\func.c",// 第二种方法:// "${file}",// "${workspaceFolder}\\day1\\func.c",// 第三种方法:// "${fileDirname}\\*.c","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin"// "cwd": "${fileDirname}":有时候"cwd"的值为:"${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "调试器生成的任务。"}],"version": "2.0.0"
}

7. 命令行方式编译C++

(1)编译单个C++文件:g++ -g "C++源文件" -o 编译生成的可执行文件,例如:g++ -g .\main.cpp -o main.exe
(2)编译多个C++文件:g++ -g "C++源文件1" "C++源文件2" ... "C++源文件n" -o 编译生成的可执行文件,例如:g++ -g a.cpp b.cpp c.cpp -o multi_file.exe
(3)上面生成的可执行文件后缀名(.exe)可以省略。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)

目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点&#xff08;来自局部关键帧&#xff09;UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)

一、时间计算的三大核心场景 当你遇到这些需求时&#xff0c;本文就是你的救星&#x1f31f;&#xff1a; 倒计时功能&#xff1a;计算活动剩余天数 用户行为分析&#xff1a;统计操作间隔时间 跨国系统&#xff1a;多时区时间统一管理 报表生成&#xff1a;自动计算同比/环…

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能&#xff0c;可以将C写的软件到浏览器中运行&#xff0c;最近一段时间正在研究这方便内容&#xff0c;普通的控件响应都能实现&#xff0c;今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境&#xff1a;window11&#xff0c;Qt6.8.2…

DeepSeek V3 源码:从入门到放弃!

从入门到放弃 花了几天时间&#xff0c;看懂了DeepSeek V3 源码的逻辑。源码的逻辑是不难的&#xff0c;但为什么模型结构需要这样设计&#xff0c;为什么参数需要这样设置呢&#xff1f;知其然&#xff0c;但不知其所以然。除了模型结构以外&#xff0c;模型的训练数据、训练…

【leetcode hot 100 240】搜索二维矩阵Ⅱ

解法一&#xff1a;直接查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i0; i<matrix.length; i){for(int j0; j<matrix[0].length; j){if(matrix[i][j]>target){break;}if(matrix[i][j]target){return true;}}}return fal…

UE4 组件 (对话组件)

制作一个可以生成对话气泡&#xff0c;显示对话台词的简单组件。这个组件要的变量&#xff1a;台词&#xff08;外部传入&#xff09;。功能&#xff1a;开始对话&#xff08;生成气泡UI&#xff09; &#xff0c;结束对话。 一、对话组件创建 二、开始对话事件 1、注意这里获…

自动化同步多服务器数据库表结构

当项目每次进行版本升级的时候&#xff0c;如果在这次迭代中涉及表结构变更&#xff0c;需要将不同的生产环境下&#xff0c;都需要同步表结构的DDL语句&#xff0c;比较麻烦&#xff0c;而且还有可能忘记同步脚本&#xff0c;导致生产环境报错.... 该方案采用SpringBootMybat…

DeepSeek安全:AI网络安全评估与防护策略

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文基于现有的公开资料&#xff0c;从企业资深网络安全专家的视角&#xff0c;系统梳理DeepSeek技术在网络安全领域的潜在贡献与核心风险&#xff0c;并结合中国…

【论文笔记】Attentive Eraser

标题&#xff1a;Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source&#xff1a;https://arxiv.org/pdf/2412.12974 收录&#xff1a;AAAI 25 作者单位&#xff1a;浙工商&#xff0c;字节&#…

【powerjob】 powerjobserver注册服务IP错误

1、问题&#xff1a;powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 &#xff0c;docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信&#xff0c;网络不通&#xff0c;注册不上 2、解决方案 …

视频录像机视频通道是指什么

视频录像机的视频通道是指摄像机在监控矩阵或硬盘录像机设备上的视频输入的物理位置。 与摄像头数量关系&#xff1a;在视频监控系统中&#xff0c;有多少个摄像头就需要多少路视频通道&#xff0c;通道数量决定了视频录像机可接入摄像头的数量&#xff0c;一般硬盘录像机有4路…

面试150,数组 / 字符串

27. 移除元素 class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 把不等于 val 的值移动到前面n len(nums)left 0for right in range(n):if nums[right] ! val:nums[left] nums[right]left 1return left26. 删除有序数组中的重复项 只保留 1…

【江科大STM32】TIM输入捕获模式PWMI模式测频率

一、输入捕获测频率 接线图&#xff1a; 测信号的输入引脚为PA6&#xff0c;信号从PA6进来&#xff0c;待测的PWM信号也是STM32自己生成的&#xff0c;输出引脚是PA0&#xff0c;所以接线这里直接用一根线将PA0引到PA6就可以了。 如果有信号发生器的话&#xff0c;也可以设置成…

湖仓一体化及冷、热、实时三级存储

一、湖仓一体化&#xff08;Lakehouse&#xff09; 湖仓一体化&#xff08;Lakehouse&#xff09;是数据湖&#xff08;Data Lake&#xff09;与数据仓库&#xff08;Data Warehouse&#xff09;的结合&#xff0c;旨在解决传统数据架构中数据孤岛、存储冗余、计算性能不足等问…

go切片定义和初始化

1.简介 切片是数组的一个引用&#xff0c;因此切片是引用类型&#xff0c;在进行传递时&#xff0c;遵守引用传递的机制。切片的使用和数组类似&#xff0c;遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的&#xff0c;因此切片是一个可以动态变化的数…

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产&#xff1a;game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程&#xff0c;从像素渲染到不使用GPU的方式&#xff0c;我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…

毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

docker中kibana启动后,通过浏览器访问,出现server is not ready yet

问题&#xff1a;当我在浏览器访问kibana时&#xff0c;浏览器给我报了server is not ready yet. 在网上试了很多方法&#xff0c;都未能解决&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana从控制台打印的日志可以发现&#xff…

在 Docker 中,无法直接将外部多个端口映射到容器内部的同一个端口

Docker 的端口映射是一对一的&#xff0c;即一个外部端口只能映射到容器内部的一个端口。 1. 为什么不能多对一映射&#xff1f; 端口冲突&#xff1a; 如果外部多个端口映射到容器内部的同一个端口&#xff0c;Docker 无法区分外部请求应该转发到哪个内部端口&#xff0c;会…

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…