vscode 一键配置配置C/C++/Cmake/make调试环境及配置原理
搜索了很多教程,发现要么是教程太老了,给的配置信息中的一些参数不能再用了,要么就是直接把自己的配置信息扔掉了。 不知道从哪里来的,也不能直接使用。 我这个新手,不知道从哪里开始,所以尝试整理一下,以帮助像我这样刚入门的新手。
对于每次都配置麻烦的人来说,下面的文章将提供vscode下c/c++的一键cmake工程小工具。 小工具生成的项目修改完成后可以做成通用项目,直接备份一份。 创建公共项目后,您以后可以直接使用修改后的模板。 只需要修改项目名称即可。
我认为最重要的是我们需要了解每个配置文件的用途以及vscode如何使用它。 明白了这一点,你就能更清楚如何改参数、改哪些参数,而不是依赖别人。 配置文件,无法启动。
本文的重点也是为了让不懂的小伙伴知道如何更改这个配置。 了解之后,同样的原理也适用于配置其他语言。 文章中的配置更多的是参考。
配置文件的基本原则:
vscode中与代码运行和调试相关的两个最基本的配置文件是tasks.json和launch.json文件(这两个文件通常位于vscode当前打开的文件夹下的.vscode文件夹中,两者都不能自动创建android源码编译设置c 编译器,只要位置正确就会生效)。
launch.json:这个配置文件告诉vscode如何开始调试你的代码程序,包括你的程序在哪里,用什么工具来调试,调试时需要传递给调试工具什么参数等。
tasks.json:此配置文件用于执行计划任务。 例如,如果在调试之前更改了代码,则必须在调试之前重新生成新程序。 然后你可以配置它告诉vscode如何重新调试它。 生成这个新程序。 (task.json不是必要文件,比如python调试,所以不需要提前编译)
vscode是先运行tasks.json任务,然后运行launch.json。
解释一点:vscode调用任务是根据label标签来标识的(文章旁边有解释)。
"lable": "startRun"
那么启用这个任务就是启用startRun。
具体配置
我这里的配置没有使用VS。 我使用跨平台 g++ 和 gcc。 在 Windows 中,已安装 MinGW。 我使用 MinGW64(gcc 版本 8.1.0 x86_64)。
如果您只运行单个 C/C++ 文件
直接安装C++插件后,就可以编写代码并直接运行。 (更新于2020年12月9日)
如果有多个文件或项目文件
如果你编写的代码有多个文件,或者使用第三方库时有多个代码文件,这里介绍如何使用makefile创建程序。
Makefile用于组织和管理不同文件的编译和链接顺序。 可以简单理解为gcc/g++命令前面的一大堆参数都放在这里。 无需每次都手动输入。 cmake用于生成makefile,因为makefile依赖于手工编写也很麻烦。
主意:
1.cmake生成makefile
2.make编译
3、调试
当然,里面的步骤是在tasks.json中配置并手动执行的。
上面的make命令是MinGW安装目录下bin目录下的mingw32-make.exe。 在tasks.json 中配置此命令。
1.首先查看launch.json文件。 这个文件的基本框架是由vscode手动生成的。 具体方法是:菜单栏==>运行==>打开配置文件。 您也可以手动创建它。 上面有说明。 只需填写下面的内容即可。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
// type 告诉vscode编译器的类型,我用的MinGW64也就是g++,这里是cppdgb
// 这个是规定的,不是随便写,比如msvc编译器就是cppvsdbg
"type": "cppdbg",
"request": "launch",
// program 这个是你的可执行程序位置,这里可以根据自己的tasks.json生成
// 程序的位置自定义修改,等会参照后面的tasks.json内容
"program": "${workspaceFolder}\build\${workspaceRootFolderName}.exe",
// ${xxxx}是vscode内置的变量,可以方便获取到需要的路径或者文件名,
// 具体什么变量参考别人的博客,
// 这里列举一部分
// ${workspaceFolder} :表示当前workspace文件夹路径,也即/home/Coding/Test
// ${workspaceRootFolderName}:表示workspace的文件夹名,也即Test
// ${file}:文件自身的绝对路径,也即/home/Coding/Test/.vscode/tasks.json
// ${relativeFile}:文件在workspace中的路径,也即.vscode/tasks.json
// ${fileBasenameNoExtension}:当前文件的文件名,不带后缀,也即tasks
// ${fileBasename}:当前文件的文件名,tasks.json
// ${fileDirname}:文件所在的文件夹路径,也即/home/Coding/Test/.vscode
// ${fileExtname}:当前文件的后缀,也即.json
// ${lineNumber}:当前文件光标所在的行号
// ${env:PATH}:系统中的环境变量
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
// 调试器的路径
"miDebuggerPath": "D:\program\mingw64\bin\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// preLaunchTask 表示在 执行调试前 要完成的任务
// 比如这里 要完成 makeRun 这个tasks任务(重新生成程序)
// 这里的 makeRun 是 tasks.json 中 lable 标记的任务名称
"preLaunchTask": "makeRun",
}
]
}
// 上面没有注释的部分基本都是默认生成的,可以不用更改的部分
2.我们再看一下tasks.json文件
任务中可以有多个任务,保存在列表中,可以根据自己的需要添加或删除。
{
"tasks": [
{
// 任务一: 创建 build 文件夹
"type": "shell",
"label": "CreateBuildDir", // lable 标记任务名称
"command": "mkdir", // 命令
// 传给上面命令的参数,这里是传给 Unix 系统的参数,windows下稍有不用,下边有
"args": [
"-p",
"build"
],
"windows": {
"options": {
"shell": {
"executable": "powershell.exe"
}
},
"args": [ // 对于windows系统,传的参数
"-Force",
"build"
]
},
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
},
// 任务二: Cmake
// 在 build 文件夹中调用 cmake 进行项目配置
// 如果想配置比如 release 还是 debug 可以添加参数或者在
// CMakeLists.txt中设置也行
{
"type": "shell",
"label": "cmakeRun", // 给这个任务起个名字
// 这里的cmake,用我后面小程序创建的结果填的是全路径,
// 命令写全路径,则路径中不能包含带空格
// 如果你添加了环境变量,那么直接填写命令即可,也不会有
// 路径是否包含空格的问题(下面的命令同理)
"command": "cmake",
"args": [
"-DCMAKE_MAKE_PROGRAM=E:\Resource\mingw64\bin\mingw32-make.exe", // MinGW目录下bin目录下的mingw32-make.exe
"-G",
// 不使用-G "Unix Makefiles" 参数可能会编译成了VS用的工程文件
// 之所以三个斜杠,是因为vscode终端自己还要转义一次
// 2021-01-21更新:我在32位的win7上发现,vscode自己又不转义了
// 所以如果以下三个斜杠不行的话,大家手动改成一个斜杠就好,即"Unix Makefiles"
// 后面我给的小程序默认写的是3个
"\"Unix Makefiles\"",
"../" // ../ 表示build文件夹的上级目录,CMakeLists.txt就放在上级目录中
],
"options": {
"cwd": "${workspaceFolder}/build"
},
"dependsOn":[
"CreateBuildDir" // 表示在 创建目录 任务结束后进行
]
},
// 任务三: make编译
{
"type": "shell",
"label": "makeRun",
"command": "mingw32-make", // 这个也是MinGW目录下bin目录下的mingw32-make.exe,如果添加了环境变量,这里直接写mingw32-make.exe
"args": [],
"options": {
"cwd": "${workspaceFolder}/build"
}, // 注意这里是编译到了项目文件夹下的 build 文件夹里面,这里就解释了
// 为什么 launch.json 中 program 路径要那么设置了。
"dependsOn":[
"cmakeRun" // 表示在Cmake任务结束后进行
]
},
],
"version": "2.0.0"
}
注:本文配置的环境如下。 如果vscode打开的文件夹是项目的根文件夹,那么调试完后,会在根文件夹下创建一个build文件夹android源码编译设置c 编译器,cmake、make之后形成的文件都会存放在里面。 cmake使用的CMakeLists.txt(可以在vscode中安装Cmake插件,有两个,可以提示你如何写这个文件,具体教程可以百度找到,基本用法很简单)应该放在项目根目录下。
我个人的例子:
1.我的目录是这样的。 我的项目名称是CPP(其实是根目录的名称),然后内容就符合注意事项了。
2.这是我的CMakeLists.txt示例
3.这是我开始调试后的终端输出
4. 多了一个build文件夹
5.结果