文章目录
- 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.c
和main.cpp
两个文件,code项目的组织结构如下图1所示。在VScode中,默认情况下code文件夹是一个workspace(工作区、工作空间)。
下面,我们基于上面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所示。
- 经过步骤1,在工作区code文件夹下可以生成一个
.vscode\tasks.json
文件,如下图3所示。除了tasks.json配置文件外,launch.json、c_cpp_properties.json配置文件也放在.vscode
文件夹下。
- 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所示。
- 执行完步骤1,会在工作区code中的.vscode文件夹里面生成一个launch.json配置文件。这里的launch.json文件是首次配置,默认为空,如下图5所示。
- 在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所示。
(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所示。
- 经过步骤1可以在.vscode文件夹中生成tasks.json、launch.json这两个配置文件,如下图8所示。
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)可以省略。