本文将通过演示一个简单C++代码的编译调试过程,介绍在VSCode中如何使用Linux环境下的GCC C++编译器(g++)和GDB 调试器(gdb)。
关于GCC、g++、gcc、gdb,这里不做详细介绍,如果感兴趣可以参考另一篇文章:详解C/C++代码的预处理、编译、汇编、链接全过程,里面有详细的解释。
看懂这篇文章的内容,只需要知道g++用来编译C++代码,gdb用来调试C++代码即可。
示例代码内容如下:
// hello.cpp#include<iostream>usingnamespace std;intmain(){
cout <<"Hello, VSCode!"<< endl;return0;}
1. 终端命令行方式编译、调试简单C++代码
如果不考虑VSCode编辑器,在Linux环境中编译调试一个简单的C++代码可以只通过命令行实现,具体过程分为两步:
- 第一步:将
*.cpp
源代码文件通过g++
编译器生成一个可调试的可执行二进制文件:
g++ -g hello.cpp -o hello
指令解析:
- 为了能够使用gdb调试,需要在编译时加上
-g
hello.cpp
:待编译的源文件名-o hello
:指定生成的可执行文件名为hello
# 运行 hello 的结果:
./hello
Hello, VSCode!
- 第二步:调用gdb调试器对可执行文件进行调试:
gdb hello
调试的过程如下:
- 如果希望在VSCode中编译调试C++代码,所要做的就是配置完成上面的两步。
2. 通过VSCode对C++代码进行编译、调试
主要参考:
- VSCode官方教程: Using C++ on Linux in VS Code
- 详解Linux下使用vscode编译运行和调试C/C++
2.1 前提条件
- VSCode中的"C/C++插件"已安装(直接在VSCode扩展商店搜索"C++"即可)
- g++编译器已安装。可以在终端查看g++是否已安装
g++ -v
如果能输出版本信息,则已安装。如果没有,通过以下命令安装:
sudoapt-get update
sudoapt-getinstall build-essential gdb
2.2 配置tasks.json
在VSCode中打开示例代码文件夹,
- 在VSCode的主菜单中,选择 Terminal>Configure Default Build Task
- 出现一个下拉菜单,显示 C++ 编译器的各种预定义编译任务。选择 C/C++: g++ build active file(如果配置了中文,会显示 “C/C++: g++ 生成活动文件”)
- 选择后,vscode会自动生成一个
.vscode
文件夹和tasks.json
文件,此时的代码文件夹结构如下:tasks.json
的内容如下:
{"version":"2.0.0","tasks":[{"type":"cppbuild","label":"C/C++: g++ 生成活动文件","command":"/usr/bin/g++","args":["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}"],"options":{"cwd":"${fileDirname}"},"problemMatcher":["$gcc"],"group":{"kind":"build","isDefault":true},"detail":"编译器: /usr/bin/g++"}]}
tasks.json
的作用是告诉VSCode如何编译程序
在本文中是希望调用g++编译器从cpp源代码创建一个可执行文件,这样就完成了第1节中所说的编译调试第一步。
从tasks.json的
"command"
和
"args"
可以看出,其实就是执行了以下命令:
/usr/bin/g++ -g ${file} -o ${fileDirname}/${fileBasenameNoExtension}
其中,
${file}
:当前活动文件(就是vscode当前查看的文件),这里是hello.cpp
${fileDirname}/${fileBasenameNoExtension}
:在这里就是当前目录下的hello
- 有关VSCode中的变量名,可以参考:VSCode Variables Reference
2.3 执行编译
在2.2节配置完成 tasks.json 文件后,VSCode就知道应该用g++编译器对cpp文件进行编译,下面执行编译即可:
- 回到活动文件hello.cpp(很重要,不然 ${file} 和 ${fileDirname}这些变量都会错)
- 快捷键
ctrl+shift+B
或从菜单中选择运行:Terminal -> Run Build Task,即可执行 tasks.json中指定的编译过程 - 编译任务完成后,会出现终端提示,对于成功的g++编译,输出如下: 这一步完成后,在代码目录下就出现了一个可执行文件
hello
。 - (可选) 个性化修改 tasks.json 可以通过修改 tasks.json满足一些特定需求,比如将
"${file}"
替换“${workspaceFolder}/*.cpp”
来构建多个 C++ 文件; 将“${fileDirname} /${fileBasenameNoExtension}”
替换为硬编码文件名(如“hello.out”
)来修改输出文件名
2.4 调试hello.cpp
完成上述的编译配置后,就可以对
hello.cpp
进行调试了:
- 回到hello.cpp,确保其是活动文件(active file)
- 设置一个断点
- 从右上角的按钮中,选择 Debug C/C++ file
- 然后就开启调试过程了,可以单步运行、添加监视等等。
2.5 个性化配置launch.json
按照2.4节的过程,已经可以简单调试一个
.cpp
代码,但是在某些情况下,可能希望自定义调试配置,比如指定要在运行时传递给程序的命令参数。这种情况下我们可以在
launch.json
中定义自定义调试配置。
下面是配置调试过程的步骤:
- 从主菜单中,选择 Run > Add Configuration…,将会生成一个
launch.json
文件 launch.json
文件右下角点击 “添加配置”,选择 “(gbd)启动”,文件内容参考如下:
{"version":"0.2.0","configurations":[{"name":"(gdb) 启动","type":"cppdbg","request":"launch","program":"${fileDirname}/${fileBasenameNoExtension}","args":[],"stopAtEntry":false,"cwd":"${fileDirname}","environment":[],"externalConsole":false,"MIMode":"gdb","setupCommands":[{"description":"为 gdb 启用整齐打印","text":"-enable-pretty-printing","ignoreFailures":true},{"description":"将反汇编风格设置为 Intel","text":"-gdb-set disassembly-flavor intel","ignoreFailures":true}],"miDebuggerPath":"/usr/bin/gdb","preLaunchTask":"C/C++: g++ 生成活动文件"}]}
这里
launch.json
的作用就是告诉VSCode如何调用gdb调试器。
如果想要在调试/运行程序时添加参数,只需要把参数添加在
"args"
选项中即可。
2.6 总结
在VSCode中编译、调试一个简单的.cpp文件,所需要做的就是:
- 在 tasks.json 中调用 g++ 生成一个可执行二进制文件
- 在 launch.json 中调用 gdb 对生成的可执行文件进行调试
2.7 复用C++配置
上面的过程已经完成了在VSCode中调试Linux环境下的C++代码的配置,但只适用于当前工作空间。如果想要在其他的工程文件夹下复用这种配置,只需要把
tasks.json
和
launch.json
文件复制到新文件夹下的
.vscode
目录下,然后根据需要改变对应的源文件和可执行文件的名称即可。
3.参考教程
- 详解Linux下使用vscode编译运行和调试C/C++
- VSCode官方教程: Using C++ on Linux in VS Code
- VSCode Variables Reference
版权归原作者 果壳中的robot 所有, 如有侵权,请联系我们删除。