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

小李子-_- 2024-09-12 16:35:04 阅读 99

文章目录

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文件配置内容如下。在配置路径时只能使用<code>\\或/隔开目录。

{

"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文件,配置的内容如下。

<code>{

"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配置文件的默认配置如下:

<code>{

"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文件

<code>#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)可以省略。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。