啊。。。。踩了好多的坑
先亮干货
一、文件树
其中:
- 文件夹名字随便取(尽量英文吧)
- .vscode文件夹为vscode的配置文件,launch.json配置调试(按F5)的动作,task.json配置一系列默认动作(比如cmake,make)。
- build文件夹存放编译数据(也就是与源码无关的衍生物)
- CMakeLists.txt:配置CMake的文档
- main.cpp 这文件名也随便取,后面CMake里配置好就行。
二、文件内容
task.json
很长,后面有解释。。
{
"tasks": [
{
"type": "shell",
"label": "CreateBuildDir",
"command": "mkdir",
"args": [
"-p",
"build"
],
"windows": {
"options": {
"shell": {
"executable": "powershell.exe"
}
},
"args": [
"-Force",
"build"
]
},
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": false,
"clear": false
}
},
{
"type": "shell",
"label": "cmakeRun",
"command": "cmake",
"args": [".."],
"options": {
"cwd": "${workspaceFolder}/build"
},
"dependsOn": [
"CreateBuildDir"
],
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": false,
"clear": false
}
},
{
"type": "shell",
"label": "makeRun",
"command": "make",
"args": [],
"options": {
"cwd": "${workspaceFolder}/build"
},
"dependsOn": [
"cmakeRun"
],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": false,
"clear": false
}
}
],
"version": "2.0.0"
}
有点长,慢慢解释:
首先,如果没有vscode,我们的编译过程是这样的:
- 创建build文件夹
- 在build文件夹里cmake …
- 在build文件夹里 make
- 直接执行或gdb(debug)make生成的.exe文件。
这里就是将每一步取一个名字放到vscode里一键执行
比如"CreateBuildDir"这个task其实就执行了mkdir build
这个命令
{
"type": "shell",
"label": "CreateBuildDir",
"command": "mkdir",
"args": [
"-p",
"build"
],
"windows": {
"options": {
"shell": {
"executable": "powershell.exe"
}
},
"args": [
"-Force",
"build"
]
},
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": false,
"clear": false
}
}
后面不过多赘述,都类似一个意思,其中像"presentation"这种关键字不懂啥意思在vscode里鼠标悬停在上面就会自动告诉你什么意思。
launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 重新make",
"type": "cppdbg", // type 告诉vscode编译器的类型,我用的MinGW64也就是g++,这里是cppdgb, 这个是规定的,不是随便写,比如msvc编译器就是cppvsdbg
"request": "launch",
"program": "${workspaceFolder}\\build\\${workspaceRootFolderName}.exe",// program 这个是你的可执行程序位置,这里${workspaceRootFolderName}表示文件夹名字,整个翻译过来就是“build\vscode_cmake.exe"
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}\\build",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\Program Files (x86)\\Dev-Cpp\\mingw_liu\\mingw64\\bin\\gdb.exe",// 调试器的路径(不同人不一样的)
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "makeRun"// preLaunchTask 表示在 执行调试前 要完成的任务,比如这里 要完成 makeRun 这个tasks任务(重新生成程序),这里的 makeRun 是 tasks.json 中 lable 标记的任务名称
}
]
}
// 上面没有注释的部分基本都是默认生成的,可以不用更改的部分
CMakeLists.txt
这里意思就编译一个main.cpp生成名为vscode_cmake.exe的可执行文件
cmake_minimum_required(VERSION 3.0.0)
project(vscode_cmake VERSION 0.1.0)
add_executable(vscode_cmake main.cpp)//编译main.cpp生成名为vscode_cmake.exe的可执行文件
main.cpp
#include "iostream"
#include "vector"
using namespace std;
int main() {
vector<int> v;
v = {1, 2, 3, 4, 5, 6};
// v = {1,2,3};
for (auto i : v) {
cout << i << endl;
}
return 0;
}
三、问题:
1. debug时vector啥的不显示值
重点应在launch.json中的
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
然而很多人把这个配置抄来也没啥用,看了很多帖子,是mingw的问题,找了一个没问题的mingw拷了过来,把其中的bin文件夹添加到环境变量中(添加完重启生效!添加完重启生效!添加完重启生效!——不重启踩坑3天的某傻子)。
这里拷来的mingw给个云盘链接造福个大众
链接:https://pan.baidu.com/s/1NQha950cxu6yppFPg3G_8w
提取码:bt4j
2. cmake配置混乱,不知道点哪个调试程序
前面的配置走好了就直接按F5,选择咱的配置就整就完了,下面那排按钮没整明白就先不管了。
看个效果