当前位置:首页 » 《关于电脑》 » 正文

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

6 人参与  2024年09月25日 10:41  分类 : 《关于电脑》  评论

点击全文阅读


文章目录

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文件为例):

首先运行hello.c文件(点击右上角的运行图标),再点击"C/C++:gcc.exe生成和调试活动文件",如图2所示。
在这里插入图片描述 图2 运行当前活动文件 经过步骤1,在工作区code文件夹下可以生成一个.vscode\tasks.json文件,如下图3所示。除了tasks.json配置文件外,launch.json、c_cpp_properties.json配置文件也放在.vscode文件夹下。
在这里插入图片描述 图3 产生的tasks.json文件 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的任务,并能实现调试功能。

单击左侧栏运行和调试图标,再点击创建launch.json文件选项,会在右侧出现选择调试器菜单。接着单击C++(GDB/LLDB),这里的GDB、LLDB是可以作为C/C++的调试器(debugger)。具体实现过程如下图4所示。
在这里插入图片描述 图4 launch.json文件生成过程 执行完步骤1,会在工作区code中的.vscode文件夹里面生成一个launch.json配置文件。这里的launch.json文件是首次配置,默认为空,如下图5所示。
在这里插入图片描述 图5 launch.json文件中的内容 在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配置文件的另外一种方式

点击右上方的添加调试配置按钮,接着再点击"C/C++:gcc.exe生成和调试活动文件",如下图7所示。
在这里插入图片描述 图7 生成tasks.json、launch.json配置文件的过程 经过步骤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://zhangshiyu.com/post/164307.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1