一 、单文件编译
#include <iostream>
using namespace std;
void swap(int &a ,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
int main(int argc , char **argv){
int val1 = 10;
int val2 = 20;
cout << "before" << endl;
cout << val1 << endl;
cout << val2 << endl;
swap(val1, val2);
cout << "after" << endl;
cout << val1 << endl;
cout << val2 << endl;
return 0;
}
首先在终端中输入g++ .\main.cpp ,会发现文件目录里自动生成了一个a.exe文件。然后输入**.\a.exe**,发现程序成功运行了。(用这个方法生成的a.exe是不包含调试信息的,也就是不能对程序进行调试) 下面用g++生成带调试信息的程序。在终端中输入:
g++ -g .\main.cpp -o myswap
其中-g表示生成带可调试信息 -o代表输出指定文件名。 可以看到左侧生成了myswap.exe。 发现这种方法生成的文件和不带调试信息的文件终端输出结果是一样的。 点击侧边栏运行与调试,创建launch.json,选择C++(GDB/LLDB)然后选择g++.exe。 打断点后按F5调试,可以看到已经可以调试了。同时VSCode自动生成了main.exe文件。 .vscode文件夹下面有launch.json和tasks.json都是自动配置的。其中launch.json种的两行比较重要:
- “program”: 是要调试的可执行文件
- “preLaunchTask”: 调试之前要做的工作,内容和tasks.json中的"label"一致。说明,执行launch.json前会执行tasks.json命令
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw\\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++: g++.exe 生成活动文件"//其实是这一步生成的main.exe
}
]
}
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\mingw\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
二、多文件编译
其中三个代码文件分别为:
#include <iostream>
using namespace std;
#include "swap.h"
int main(int argc , char **argv){
int val1 = 10;
int val2 = 20;
cout << "before" << endl;
cout << val1 << endl;
cout << val2 << endl;
swap(val1, val2);
cout << "after" << endl;
cout << val1 << endl;
cout << val2 << endl;
return 0;
}
void swap(int &a, int &b);
#include "swap.h"
void swap(int &a ,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
二、使用步骤
1.基于g++
在终端terminal,输入g++ -g .\main.cpp .\swap.cpp -o myswap 就是将所有要编译的cpp文件都写上
PS D:\code\Mo> g++ -g .\main.cpp .\swap.cpp -o myswap
运行启动调试会发现报错。原因是自动生成了json文件不能同时编译多个文件,需要我们手动改,这时打开launch.json, 以下是没修改前的launch.json,我添加的注释是要修改的地方。
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",//将这一句改成"${fileDirname}/myswap.exe"
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw\\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++: g++.exe 生成活动文件"//由于我们通过终端g++命令已经生成了exe文件,所以这行可以注释掉
}
]
}
修改完launch.json文件,保存后,再按调试(F5),发现此时已经可以调试了:
2.基于cmake
先创建CMkeLists.txt文件。方法同新建cpp文件。
project(MYSWAP)//起一个项目名
add_executable(my_cmake_swap main.cpp swap.cpp)//一个是生成的可执行文件名字,其他参数是要加入编译的的cpp文件
Ctrl Shift + p 输入cmake 选择cmake configure ,选择一个编译器(可以是类似GCC8.1.0)我选的是GCC11.2.0。 下面输出了信息证明cmake构建完成,同时目录里自动生成了一个build文件夹 终端中输入cd .\build**然后输入mingw32-make.exe**可以看到编译链接后产生了my_cmake_swap文件: 为了使文件能够调试,这时候打开launch.json文件,改路径到刚刚生成的build文件夹下的my_cmake_swap文件。 将"program": “
f
i
l
e
D
i
r
n
a
m
e
/
m
y
s
w
a
p
.
e
x
e
"
,
改
成
"
p
r
o
g
r
a
m
"
:
"
{fileDirname}/myswap.exe",改成 "program": "
fileDirname/myswap.exe",改成"program":"{fileDirname}/build/my_cmake_swap.exe”,
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/build/my_cmake_swap.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw\\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++: g++.exe 生成活动文件"
}
]
}
此时在main文件下按F5可以正常调试了。 注意点:通过cmake的方式生成的可执行文件,进行调试时只能是之前编译的代码,如果我们想把代码进行更改,需要修改代码后重新cmake出一个新的可执行程序。如下图虽然我改了main函数中的cout两句,F5调试时依然是输出的上一个没修改前的情况。 重新cmake后,再调试会发现输出了正确的结果。 以上步骤由于 //“preLaunchTask”: "C/C++: g++.exe 生成活动文件"这一行注释掉了,也就是没有用task,所以步骤删掉task.json也是可以的。如果取消注释,F5调试会报错。这时候需要新建一个task.json。 可以把 “preLaunchTask”: “C/C++: g++.exe 生成活动文件” 随便改成别的内容,比如我改成了 “preLaunchTask”: “C/C++生成文件” 然后F5报错,选择配置任务,然后选g++。系统会自动生成一个tasks文件。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\mingw\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:\\mingw\\bin\\g++.exe"
}
]
}
3.不用cmake仅仅是修改json文件
系统自动生成的task文件默认是单文件调试,所以可以修改task.json的args部分,修改后
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\mingw\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"main.cpp",//改了这里
"swap.cpp",//改了这里
"-o",
"${fileDirname}\\out.exe"//改了这里,改成想输出的文件的名字
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:\\mingw\\bin\\g++.exe"
}
]
}
注意lable和prelaunchtask后内容要对应。 同时launch文件的 “program”: “${fileDirname}/out.exe”,也要和tasks生成的路径相同。 此时就可以边改代码随时调试了。
4.这个方法我还没实现(有bug)
如果我们既想要用cmake又不想繁琐地在终端中重新cmake,可以将cmake指令写入到task文件中,这样每次F5调试时,都会自动调用cmake指令了。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
// launch.json
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/my_cmake_swap.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "Build"
}
]
}
```bash
{ // tasks.json
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "mingw32-make.exe",
"args": [
]
},
{
"label": "Build",
"dependsOn": [
"cmake",
"make"
]
}
],
}
|