声明:本文参考自b站《手把手教会VSCode的C++环境搭建,多文件编译,Cmake,json调试配置( Windows篇)》:https://b23.tv/HiWjVl
更多精彩:《基于VSCode和CMake实现C/C++开发 | Linux篇》
https://www.bilibili.com/video/BV1fy4y1b7TC
总体认识
vscode中有两个配置文件非常关键,launch.json、tasks.json,要想理解这两个文件的作用,首先需要理解
- 一个C++是如何被编译的;
- 如何用CMake构建多文件大型程序。
launch.json是调试运行一个已经编译好的程序,而调试运行的前提是编译整个项目,这正是tasks.json的任务,tasks.json调用CMake命令才能编译多文件项目,下面具体来看
实操演练
-
基于 g++ 命令
- g++编译单文件,生成带调试信息的可执行文件
g++ -g main.cpp -o my_single_swap # -g 生成带调试信息的可执行文件 # -o 指定生成可执行文件的名字
- g++编译多文件,生成带调试信息的可执行文件
g++ -g main.cpp swap.cpp -o my_multi_swap # -g 生成带调试信息的可执行文件 # -o 指定生成可执行文件的名字
-
基于CMake
-
编写最简单的
CMakeLists.txt
# 指定Cmake工程名 project(MYSWAP) # 编译main.cpp swap.cpp,生成my_cmake_swap.exe的可执行文件 add_executable(my_cmake_swap main.cpp swap.cpp)
-
进行多文件编译,并调试
# 新建build文件夹 mkdir build # 进入到build目录 cd build # 如果电脑上已安装了VS,可能会调用微软MSVC编译器, # 使用(cmake -G "MinGW Makefiles" ..) 代替(cmake ..) # 仅第一次使用cmake时使用(cmake -G "MinGW Makefiles" ..),后面可使用(cmake ..) # cmake编译上级目录 cmake .. # 执行windows下的make指令 mingw32-make.exe
-
配置json文件
-
launch.json ---- for debug
- 作用:配置调试信息,用来调试编译好的程序
program
:可执行文件的路径preLaunchTask
:执行调试前所执行的task
-
tasks.json ---- for build before debug
- 作用:包含调试前的操作指令,用来做调试前的编译工作 (操作指令都是为编译服务的)
- 可以避免每次修改代码后,手动编译;即tasks.json其实是和 手动编译 的作用等价的
- tasks.json某个task包含了编译命令: 编译代码,并生成可执行文件
- tasks.json中的这个task的
label
应与launch.json中的preLaunchTask
名字一致
下面列出CMake工程的tasks.json:
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build" // "cwd"表示当前工作目录:current working directory
},
"tasks": [
{
"type": "shell",
"label": "cmake", // 该任务的标签是:"cmake"
"command": "cmake", // cmake任务生成makefile文件
"args": [ // cmake命令后所跟的参数,".."表示在父目录
".."
]
},
{
"label": "make", // 该任务的标签是:"label",根据makefile文件进行编译
"group": {
"kind": "build", // 当前任务所属的组是build组
"isDefault": true
},
"command": "mingw32-make.exe", // 在Windows下实际执行的命令是:mingw32-make
"args": [ // mingw32-make命令后面所跟的参数
]
},
{
"label": "Build", //这个名为"Build"的task是launch.json执行前所预先执行的任务
"dependsOn":[ // 并且这个任务又依赖"cmake"和"make"这两个任务
"cmake",
"make"
]
}
],
}
下面是launch.json文件配置的相关说明:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件", // 名字随便
"type": "cppdbg",
"request": "launch", // 这个是启动任务,不是附加任务
"program": "${workspaceFolder}\\build\\my_cmake_swap.exe", // 要执行的可执行文件的路径
"args": [], // 该可执行文件执行时后面跟随的参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 表示当前的工作目录在哪里
"environment": [],
"externalConsole": false, // 是否使用外部控制台
"MIMode": "gdb",
"miDebuggerPath": "D:\\Environment\\mingw64\\bin\\gdb.exe", // debugger的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "Build" // 该任务启动前预先执行的任务,即编译任务
}
]
}