二、使用VS Code编写C++代码 进阶(下)
二、使用VS Code编写C++代码 进阶(下)
使用cmake编译项目文件。
- 基于cmake
- 编写最简单的CMakeLists.txt
project(MYSWAP) add_executable(my_cmake_swap,main.cpp swap.cpp)
- 进行多文件编译并调试
mkdir build cd build # 如果电脑上已经安装了VS,可能会调用微软 MSVC编译器,使用(cmake -G "MinGW Makefiles" ..)代替(cmake ..)即可 # 仅一次使用cmake时使用(cmake -G "MinGW Makefiles" ..) 后面可使用(cmake ..) cmake .. mingw32-make.exe
- 配置json
- launch.json -- for debug
- tasks.json -- for build before debug
cmake可以生成makefile,makefile可以指定编译规则,但makefile很难手工去写。所以cmake工具可以自动生成makefile文件。如果要使用cmake工具来构建项目,
首先在目录下新建一个文件CMakeLists.txt.
如何通过cmake生成可执行文件?在操作之前需要对cmake进行额外的配置:
进入命令面板(Ctrl+Shift+P),
选择编译器
回到终端,进入build文件夹下:
生成了可执行文件my_cmake_swap.exe文件。
生成的可执行文件的位置:
如何进行调试呢?
进入lanuch.json文件进行配置。
修改后的program值:
"program": "${workspaceFolder}/build/my_cmake_swap.exe"
preLaunchTask值先注释。
修改后的launch.json文件的内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: 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, // false表示在终端输出 true表示新生成一个cmd窗口输出
"MIMode": "gdb",
"miDebuggerPath": "D:\\application\\minGW\\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++: g++.exe 生成活动文件" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
}
]
}
回到main.cpp文件,设置断点,按F5启动调试。
上面程序运行过程中,我们并没有使用到mkdir build命令。这个命令可以自己去建立一个build文件夹,而不需要等系统去创建。
下面演示,手动创建build文件夹。在终端的工程路径下输入指令mkdir build.
这里会出现一个问题:
解决方案:使用cmake -G "MinGW Makefiles" .. 代替 cmake ..
如果按F5会发现,并不能断点调试,这是因为系统默认的cmake ..不包含调试信息,需要使用cmake ..-DCMAKE_BUILD_TYPE=Debug
下面详细看launch.json文件:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: 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, // false表示在终端输出 true表示新生成一个cmd窗口输出
"MIMode": "gdb",
"miDebuggerPath": "D:\\application\\minGW\\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++: g++.exe 生成活动文件" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
}
]
}
当对源代码进行修改时,由于上面launch.json文件中的"preLaunchTask": "C/C++: g++.exe 生成活动文件"
注释掉了,所以再次进行调试,就不会对源码重新编译了。 所以为了修改源代码时, 按F5时, 能够自动匹配修改的程序,所以要讲注释给打开。
但是按F5后,无法进行调试。
说明系统中没有名称为C/C++: g++.exe 生成活动文件
的task,所以在task.json文件中,讲label值改为C/C++: g++.exe 生成活动文件
。默认生成的tasks.json是单文件调试,
改过后的tasks.json文件如下图所示:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "D:\\application\\minGW\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"main.cpp",
"swap.cpp",
"-o",
"${fileDirname}/build/my_cmake_swap.exe"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
改过后的launch.json文件如下图所示:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: 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, // false表示在终端输出 true表示新生成一个cmd窗口输出
"MIMode": "gdb",
"miDebuggerPath": "D:\\application\\minGW\\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++: g++.exe build active file" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
}
]
}
补充: cmake ..的含义:cmake .. 使用 ../CMakeLists.txt 文件作为起始点在当前目录中生成makefile。