赞
踩
首先我们创建了一个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
(上面这篇文章介绍的比较详细,我下面总结的大部分内容都摘抄于该文章,非常感谢该博主)
tasks.json在编译时用的到,配置tasks.json文件的步骤(下面以hello.c文件为例):
.vscode\tasks.json
文件,如下图3所示。除了tasks.json配置文件外,launch.json、c_cpp_properties.json配置文件也放在.vscode
文件夹下。\\
或/
隔开目录。{ "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)。
launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.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"值对应一致。
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 }
文件中的参数介绍如下:
"${workspaceFolder}/**"
:当前项目所在根目录并递归搜索子目录,也就是当前工作区文件夹的路径(例如:D:\code),而且还会递归查找其所有的子目录。 按照上面步骤配置好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" }
(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)可以省略。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。