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

avatar
作者
筋斗云
阅读量:0

文章目录

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!