采用排除法:
1.是否将工作文件夹添加工作区?
打开vscode -》 文件 -》 打开文件夹 -》文件 -》将文件夹添加工作区(或者另存为一个),把工作区文件放到工作文件夹里。
如下:Manager.code-workspace
工作区结构:.vscode文件夹装配置文件,.code-workspace工作区,ManagerSys.h类的声明,ManagerSys.cpp类成员函数(方法)的定义,ManagerSystemMain.cpp主程序
2.基础文件配置?
电脑上编译器是下载的MinGW里面的g++,保存位置在D:/Mingw/mingw64/bin/g++.exe
2.1 配置c_cpp_properties.json文件:
includePath是包含头文件的路径,需要把当前工作文件夹路径加入进去,例如此处添加就是Manager那个路径。
每个工作文件都需要增加自己的
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"D:/Mingw/mingw64/include/**",
"D:/Mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/**",
"D:/Mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward/**",
"D:/Mingw/mingw64/include",
"C:/Users/YHW/Desktop/Ctest/**",
"C:/Users/YHW/Desktop/Manager/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "D:\\Mingw\\mingw64\\bin\\g++.exe",
"cStandard": "c89",
"cppStandard": "gnu++98",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
2.2 配置launch.json文件:这是为了调试的配置
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gdb 启动器",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\Mingw\\mingw64\\bin\\gdb.exe",
"preLaunchTask": "g++", // prelaunch作用是进行编译
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
2.3 配置task.json文件:
配置task文件的时候就会出现不同:因为vscode不像VS那样直接就对于工程文件编译,vscode需要在配置中加上链接,通知编译器文件的联系。
注意自己文件和文件夹的名称
第一种情况:只需要编译通过单个cpp文件,其他cpp文件不需要同时编译
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "g++",
"command": "D:/Mingw/mingw64/bin/g++.exe",
"args": [
"-g",
//"${workspaceFolder}\\ManagerSys.cpp",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe",
],
"options": {
"cwd": "D:\\Mingw\\mingw64\\bin\\"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "test",
"isDefault": true
},
"detail": "D:/Mingw/mingw64/bin/g++.exe"
}
]
}
编译时只对目标文件调试即可。(绿色的小箭头开始编译)
第二种情况:需要编译通过所有cpp文件
此时task文件需要更改为:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "g++",
"command": "D:/Mingw/mingw64/bin/g++.exe",
"args": [
"-g",
"${workspaceFolder}\\*.cpp", //多文件一起编译
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe",
],
"options": {
"cwd": "D:\\Mingw\\mingw64\\bin\\"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "test",
"isDefault": true
},
"detail": "D:/Mingw/mingw64/bin/g++.exe"
}
]
}
tasks.json文件中的args参数,实际上就是调用gcc时,后面所跟的参数在初始的配置中,实际上编译器执行的命令为gcc -g XXX.cpp -o XXX.exe,而修改后的配置中,执行的命令是gcc -g XXX.cpp XX.c -o XXX.exe,这是由于参数${file}代表的是被编译的当前文件,而参数${workspaceFolder}\\*.cpp代表的是当前目录下的所有.cpp文件
到此结束。
3、错误排除
出现“undefined reference”这种问题
两种可能:
1.点一下runCode的播放按钮,看看有没有产生exe文件
2.上面的文件配置是否正确,更改完重启vscode,开始调试。
如果是多文件同时编译,只需要点Main函数的调试步骤即可,头文件和类的声明不需要。
成功之后如图
3.虚构函数导致的内存溢出
出现的是undefined reference: classtest::~classtest,说明基类虚构函数不是虚函数,要加virtual;
或者直接注释掉虚构函数,最后再来调试.