vscode:|vscode: windows/linux下配置C/C++编译和调试环境

作者:__lifanxin
链接:https://blog.csdn.net/A951860555/article/details/109175215
来源:CSDN
著作权归作者所有,任何形式的转载都请联系作者。
说在前面 ??本文是从官方文档以及实际操作中总结而来,对于从事该行业的专业人员来说,推荐多看官方英文文档;当然对于初学者而言,先行阅读一个较好的中文指导博客也是无可厚非的。

链接: vscode C/C++环境配置官方文档.
正式起步 安装gcc组件 ??windows下可以下载mingw-w64,关于mingw-w64的说明可以参见百度百科。而对于大多数linux系统而言,一般都自带有gcc、g++的编译环境,所有如果你正在使用常见的ubuntu系统、mac系统的话就不需要安装。
添加环境变量 ??这一步是需要windows用户单独操作的,也就是并不自带gcc组件的系统。
??添加环境变量的步骤很简单,首先找到正确的gcc组件所在的bin目录,也就是说目录路径只能到bin为止,而不能明确到gcc,因为在bin目录下不止有gcc,还有g++、gdb等程序。然后在win10系统中可以直接搜索环境变量,添加到系统变量或者用户变量的path即中。
??在添加环境变量后,我们就可以在终端中直接输入gcc --version等命令,如果显示版本信息即可证明添加成功。这是因为本来在终端需要执行一个命令就是在path环境变量中去查找该命令程序的所在目录,一般系统都会自动配置一些程序路径在这里,所以像自带gcc组件的ubuntu和mac这些早已配置好了相应环境变量的系统,不用配置也能在终端执行相应命令。当然我们之所以需要在这里添加环境变量,只是为了方便后面vscode自动生成一些配置文件时可以找到gcc、g++的路径。
创建helloworld项目 ??下面我们开始用helloworld项目来完善我们的配置。
??新建一个test文件夹,在文件下新建hello.c或者hello.cpp,一个用于C语言,一个用于C++。接下来就是最关键的配置文件生成部分。
hello.c
#include int main(void) { printf("hello, world\n"); return 0; }

hello.cpp
#include int main(void) { using namespace std; cout << "hello, world!" << endl; return 0; }

生成编译配置文件 编译配置-->tasks.json
??首先,选中.p或者.cpp文件,也就是一定要在vscode中打开相应的源代码文件(否则不会出现如下第二张图的模板文件选项),然后按照下图一中进行操作,点击Terminal-->Configure Tasks或者Configure Default Build Task。

vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
创建tasks.json
??接下来会出现vscode自带的模板文件选项,是C就选择 gcc.exe,是C++就选择 g++.exe
vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
C++编译模板配置
??不同的系统展示会略有区别,如下是ubuntu系统所示,会展示详细的compiler信息来帮助我们进行选择。
vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
ubuntu tasks.json ??选中相应的模板文件后,会在当前目录下生成.vscode文件夹,里面会出现tasks.json文件,该文件即对应执行程序编译的配置文件,其内容如下:
windows下tasks.json
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++.exe build active file", "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe", "args": [ "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }

ubuntu下tasks.json
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "/usr/bin" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "compiler: /usr/bin/g++" } ] }

关键键值名
??上面的两个文件大同小异,对于json文件中的健我们可以直接在vscode中通过鼠标的悬停来进行了解,不过这里我们着重了解一些关键的健值就行了。
  • label
    ??可以理解为tasks这个健所对应数组中第一个配置对象的名字,也就是说我们还可以在此数组中配置第二个编译指令,如下图所示,注意label标签名的不同且两个配置之间有逗号隔开。所以如果你有在同一个项目中配置不同编译的需要,就可以这样配置。
以windows下tasks.json为例,其它系统也一样
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++.exe build active file", "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe", "args": [ "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } }, { "type": "shell", "label": "C/C++: NEW g++.exe build active file", "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe", "args": [ "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }

  • command
    ??顾名思义就是编译所需要的程序命令,如果之前配置好了环境变量,那么就会自动生成该路径,否则需要自己手动配置。上图中,windows的tasks.json中command是我自己电脑上的gcc路径,而ubuntu使用自己的系统环境路径/usr/bin/g++。注意linux系统中的程序没有后缀名.exe
    ??当然如果编译C就使用gcc,编译C++就使用g++,当然用gcc也可以编译C++程序源代码,不过需要加上链接库-lstdc++,否则会报找不到C++特定库中方法的错误。该参数需要添加在下面的args字段中。
  • args
    ??args字段实际上就是gcc、g++命令的参数,也就是说如果通过终端使用gcc编译C++源代码文件,需要输入gcc -g hello.c -o hello.exe -lstdc++-g表明启用调试(然后可以在终端使用gdb进行调试,否则不行),-o是指定输出文件的名字(否则自动为a.out),-lstdc++指明链接C++的库(否则编译报错)。
    ??因此vscode就是把该终端命令分成了两部分,command指明了所使用的程序,args指明了后面接的参数。当然vscode中使用了一些特定的标签名,${file}代表在vscode中呈现在活动界面即当前打开且被选中的文件;"${fileDirname}\\${fileBasenameNoExtension}.exe${fileDirname}是一个变量名,代表被选中文件所在的文件夹,windows下用双反斜杠\\隔开路径(第一个反斜杠表示转义,即双反斜杠在json才代表一个\\是windows路径下的分隔符,否则在json中使用\会转义字符$),然后${fileBasenameNoExtension}.exe表示使用被选中的文件名但不用其扩展名,然后以后缀.exe作为扩展名;而ubuntu下使用的是斜杠/分割路径,并且没有后缀名,当然在vscode还有更多的变量名,可以参考官方文档:
链接:tasks.json和launch.json文件中的变量说明
tasks.json完整配置
??windows下tasks.json完整配置如下图所示,ubuntu见上图第一次给出的tasks.json文件:
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++.exe build active file", // 使用自己电脑上的路径 "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe", "args": [ "-g", // 想编译当前文件夹下所有.cpp文件可以这样写 // "${fileDirname}\\*.cpp" "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }

启动编译 ??如下图所示,点击Terminal-->Run Build Task执行默认的编译选项(Run Task 会列出所有的编译配置选项),此操作会使用我们之前配置好的tasks.json文件来对源代码进行编译,在windows下生成hello.exe文件,ubuntu下生成的程序则没有后缀名。

vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
启动编译
??至此,我们的C/C++的编译环境已经配好,windows下在终端输入 ./hello.exe,ubuntu下输入 ./hello即可运行程序。下面进入调试环境的配置。
生成调试配置文件 调试配置-->launch.json
??同上面一样,选中需要进行debug调试的文件,按照下图所示点击Run-->Add Configuration即可在.vscode文件夹下生成launch.json文件。
vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
创建launch.json
windows下launch.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "输入程序名称,例如 ${workspaceFolder}/a.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }

ubuntu下launch.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "g++ - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "C/C++: g++ build active file", "miDebuggerPath": "/bin/gdb" } ] }

关键键值名
【vscode:|vscode: windows/linux下配置C/C++编译和调试环境】??如上图所示,在ubuntu下可能已经自动生成好了完整的debug调试配置,如果没有也没关系,按照下面的操作进行就行。
  • name
    ??该json配置对象的名字。同样也可以在此为launch.json配置多个debug调试对象,添加方式和tasks.json一样,只需要把配置放在Configurations数组中,命名一个不同的name
  • program
    ??指明你需要调试的程序名,即上一步编译生成的可执行文件,该字段内的内容需要重新编写,自动生成的内容已给出了示例:${workspaceFolder}\\a.exe。其中${workspaceFolder}表示在vscode中所打开的根文件夹,可以替换为${fileDirname}表示打开文件所在的文件夹;a.exe应该替换为自己需要调试的程序名,或者改为${fileBasenameNoExtension}.exe自动衔接上文tasks.json生成的程序名,这里还应当注意程序所在的目录路径是否相符合。注意ubuntu下使用/分隔路径,程序名不加.exe后缀。
  • args
    ??args中是gdb命令所需要的参数,一般不用写,有特殊需要的可以在网上查找相关的资料。
  • MIMode
    ??指明调试所使用的程序,按照默认设置为gdb即可。
  • miDebuggerPath
    ??指明调试程序的路径,在这里需要更改为自己的gdb路径且要包括gdb.exe此程序名字,例如我的:C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe。ubuntu下为/usr/bin/gdb或者/bin/gdb
  • preLaunchTask
    ??这个键值在上面windows自动生成的配置中并没有出现,需要自己配置一下(和上图ubuntu中的配置一样)。该键值的目的是指出在执行debug调试之前需要执行的tasks任务,也就是tasks.json下的某个编译指令。在这里,我们将preLaunchTask键值设为C/C++: g++.exe build active file即对应我们之前配置好的tasks.json中的label标签名,这样一来我们在直接debug时就可以自动运行相应的编译指令,而不用每次都要先编译一下,然后再debug调试。
launch.json完整配置
??下面给出windows下完整的launch.json配置,ubuntu完整配置见上图第一次给出的launch.json:
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: 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", // 替换为自己电脑上的gdb路径 "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe`", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], // 要和tasks.json中的label标签名对应 "preLaunchTask": "C/C++: g++.exe build active file" } ] }

启动调试 ??如下图所示,点击Run-->Start Debugging,即会按照launch.json文件配置来对相应的程序进行debug。

vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
启动调试
??在调试的时候给程序打好断点,如下图所示,我对代码略微进行了修改,声明了num变量,运行debug调试后,点击有个虫子(bug)样式的图标,然后在左侧栏就可以看到变量的值。

vscode:|vscode: windows/linux下配置C/C++编译和调试环境
文章图片
断点调试 结束语 ??经过上面一番折腾,我们已经配置好C/C++程序的编译和调试环境,当然如果需要在其它项目中应用相同的环境配置,可以直接复制.vscode到其它项目的根目录下即可。那么,现在就开始愉快的编程吧!

    推荐阅读