一、基于 g++ 的命令
1. g++ 编译单文件,生成带调试信息的可执行文件并调试
- 方法一
生成可执行文件
# -g 表示生成带有可调试信息的文件
# -o 表示指定生成的文件名(缺省状态下为 a.exe)
g++ -g main.cpp -o my_single_swap
使用 -g 生成带有调试信息的可执行文件会比没有使用 -g 生成的可执行文大(包含调试信息)。
如果想运行该可执行文件,可以再终端输入文件名然后按下 tab (可以帮你补全),然后就可以看到运行结果了。
调试
首先点击运行和调试(一个三角和一个小虫子的标志),然后再点击创建 launch.json 文件。
 选项,因为我们使用 g++ 里的 GDB 这个调试器帮助我们调试。
之后系统会生成一个 launch.json 文件,之后可以点击添加配置。
之后会自动生成一些字段,里面主要需要修改的就是 program 和 miDebuggerPath,前者是可执行的位置,后者是 gdb 所在的位置。同时也可以注意一下字段 “cwd”,这是表明当前文件所在的工作目录。
配置完之后,就可以进行测试了,在代码处找到一个断点,然后就可以进行调试了。
- 方法二
生成可执行文件
直接按下 F5 键(一定点开要在需要编译的那个文件),也就是运行 -> 启动调试,之后选择调试器为 C++(GDB/LLDB)。
再选择 g++。
此时会生成两个文件,一个是 tasks.json 还有一个是以你刚刚想要编译的文件为名字的 .exe 的可执行文件。tasks.json 文件里是一些运行文件的配置。
而下方的终端会显示运行结果。
现在看一下 tasks.json 里的一些字段。首先是 label 字段,这个也就相当于 tasks 的名字(如果通过 tasks.json 来生成可执行文件的话,launch.json 中会有一个字段与 label 对应);command 字段是 gdb 所在的位置;args 就可以设置需要编译的文件,以及生成的可执行文件。
其实也可以发现 args 里的信息和之前再终端输入的信息非常像,其实也就是 tasks.json 帮助我们执行那句命令,并生成 main.exe 这个可执行文件。需要注意的是,tasks.json 的 label 和 launch.json 的 preLaunchTask 参数值需要保持一致。
调试
之后的步骤与方法一类似,唯一不同的是继续要在 launch.json 最后加上 preLaunchTask 字段以及他的值(tasks.json 的 label),表明这个 tasks.json 是再 launch.json 之前需要执行的,必须需要这个 tasks.json 生成带有调式信息的可执行文件 .exe 之后才能进行调试。
- 方法三
生成可执行文件
首先需要配置默认编译器,可以按下 ctrl+shift+p 组合按键打开命令面板,然后搜索 Configure Default Build Task。
选择使用 g++ 来生成。
然后就可以再资源管理器里看到,系统帮我们生成的 tasks.json 文件。
调试
接着继续配置调试相关的内容,按下 ctrl+shift+p 组合按键打开命令面板,然后搜索 Add Debug Configuration。
选择 g++。
然后就会生成 launch.json 文件,之后的操作就和之前的相同了。
- 方法四
可以在扩展中,搜索 Code Runner,并安装。
安装完成之后,就可以在 VS Code 的右上角看到。
安装了 Code Runner 插件后,操作就比较简单了。
2. g++ 编译多文件,生成带调试信息的可执行文件并调试
g++ 编译多文件和编译单文件并没有太大的差别,只需要将所有的文件名都带上就可以了。
- 终端
g++ -g main.cpp swap.cpp -o my_multi_swap
- 设置 launch.json 文件和 tasks.json 文件
总的来说就是 tasks.json 生成了可执行文件,launch.json 指向了那个可执行文件,并进行调试。
二、基于 CMake
CMake 可以帮助生成 MakeFile。MakeFile 可以指定编译规则,但是书写十分困难,CMake 可以用很少的代码生成复杂的 MakeFile。
1. 配置 CMake
首先我们需要在扩展中下载 CMake 和 CMake Tools 两个插件。
然后,需要我们选择一下编译器,可以按下 ctrl+shift+p 组合按键打开命令面板,然后搜索 CMake Configure。
然后我们编译器选择 GCC 8.1.0,选择自己版本就行。
配置成功后我们就可以在 VS Code 下方看到我们选择的 CMake。同时,他也帮我们建立了一个 build 文件夹。
如果需要更改的话,点击一下就可以更改了。
2. 编写 CMakeLists.txt
生成可执行文件
首先要在主目录里创建 CMakeLists.txt 文件。
在 CMakeLists.txt 中我们输入下面两行。
projecct(MYSWAP)
add_executable(my_cmake_swap, min.cpp, swap.cpp)
第一行指定我们这个项目的名字(指定为 MYSWAP),第二行生成 CMake 的可执行文件(第一个参数是生成可执行文件的名字,后面的参数是需要参与的文件名)。
然后我们在终端执行以下操作,来生成 CMake 的可执行文件。
首先进入到 build 文件夹下,然后执行 cmake ..
,这样我们就设置好了。最后输入 mingw32-make.exe
(Windows 下的 make 工具)。
调试
调试还是在 launch.json 中进行配置(需要注意的是要将可执行文件的位置写对)。
3. 手动创建 build 文件夹
也可以手动创建 build 文件夹。
mkdir build
cd build
# 如果电脑上已安装了 VS,可能会调用微软 MSVC 编译器,使用(cmake -G "MinGW Makefiles" ..) 代替 (cmake ..) 即可
# 仅第一次使用 cmake 时使用(cmake -G "MinGW Makefiles" ..) 后面可使用 (cmake ..)
cmake ..
mingw64-make.exe
首先创建 build 文件夹,然后进入 build 文件夹(此时 build 文件夹是空的)。
进入 build 文件下后执行 cmake ..
。
在执行完 cmake ..
后,会发现和之前创建的 build 内容不太一样,这是因为电脑上已安装了 VS,会调用微软 MSVC 编译器。使用 cmake -G "MinGW Makefiles" ..
代替cmake ..
即可(仅第一次使用时需要)。需要把之前创建的 build 文件夹删掉重新弄一遍。
三、tasks.json 和 launch.json
1. launch.json – for debug
launch.json 主要就是绑定可执行文件的位置,设置一些调试时需要的东西。
命令行参数也就是 main 函数中 argv 里的东西,argc 是命令行参数的个数,argv 就是存放命令行参数的地方。如果有需要用到命令行参数的话,就需要放到 launch.json 中的 args 里。
2. tasks.json – for build before debug
由于每次 launch.json 调试的都是 .exe 可执行文件,也就是说如果你更改了代码,但是没有生成新的 .exe 文件,那么此时调试的文件还是之前没有改过的代码。所以每次调试之前都需要编译出新的 .exe 文件,但是有的时候(比如 CMake)生成 .exe 文件的步骤比较多,这时候就需要一个 tasks.json 来帮忙执行。
tasks.json 就是帮忙处理调试之前的编译工作。下面的 tasks.json 包含了 cmake、make 以及 build 三个 task。
由于我们需要执行最后一个 task,也就是 label 时 build 的 task,所以我们需要交 launch.json 的 preLaunchTask 字段改成 build。cmake 的 args 中的 “-DCMAKE_BUILD_TYPE=Debug” 是为了让程序调试的时候在断点处可以停下来,不加的话会无视断点。
3. 变量(参考)
变量名 | 含义 |
---|---|
${workspaceRoot} | 当前打开的文件夹的绝对路径+文件夹的名字 |
${workspaceRootFolderName} | 当前打开的文件夹的名字 |
${file} | 当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名 |
${relativeFile} | 从当前打开的文件夹到当前打开的文件的路径如 当前打开的是test文件夹,当前的打开的是main.c,并有test/first/second/main.c那么此变量代表的是 first / second / main.c |
${fileBasename} | 当前打开的文件名+后缀名,不包括路径 |
${fileBasenameNoExtension} | 当前打开的文件的文件名,不包括路径和后缀名 |
${fileDirname} | 当前打开的文件所在的绝对路径,不包括文件名 |
${fileExtname} | 当前打开的文件的后缀名 |
${cwd} | 任务开始运行时的当前工作目录 |
${lineNumber} | 当前打开的文件,光标所在的行数 |
更详细的也可以参考官方文档。