VSCODE配置使用cmake构建c++项目
准备工具
具体如何下载,大家百度一下就行,具体说一下配置细节.
- vscode (要安装cmake和cmake tools插件 不安装也行,主要是cmake tools 会有cmake语法补全, 而cmake tools 依赖cmake插件)
- cmake
- mingw (当前要是有QT等使用QT下的mingw也行)(需要把里面的bin目录添加到环境变量当中)
具体配置
vscode下需要在你项目根目录新建一个.vscode文件夹(也可以自动生成,就按照最简单的办法说),然后在这个目录下一般需要配置三个文件.稍后详细介绍:
- task.json 2. launch.json 3. c_cpp_properties.json(有没有都行)
task.json
这个文件的具体作用是配置构建(编译)任务.(简单来说就是拼接字符串,而我们执行的命令也是一个字符串,所以说这个文件的作用是拼接命令)举个简单例子我们写好一个helloword.cpp,而helloworld.cpp当中引用了某个数学函数我们使用终端编译helloworld.cpp生成helloworld.exe时一般需要执行 g++ -g helloworld.cpp -lm -o helloworld.exe , 其中-lm是说编译的时候要链接数学库(m math的首字母) -o helloworld.exe 是指生成的这个程序叫什么名字, 可以随便取. 那如何让vscode帮我们自动执行g++ helloworld.cpp -lm -o helloworld.exe 这条命令,并且把-lm 换成-l(我们所需要的库)? task.json 就是干这个活的.我们需要在这个文件中写清楚就好.下面是拼接g++ -g helloworld.cpp -lm -o helloworld.exe 这个命令的例子:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell", //任务类型 就是说这个task.json 最后其实生成的是一条命令,具体的生成过程其实就是字符串拼接过程
"label": "build", //任务的名称,可以随便修改,"zhangsan","lisi"都可以
"command": "/usr/bin/g++", //编译器(可执行文件)的路径, 这条参数最后变成命令当中的 /usr/bin/g++
"args": [ //(常用)编译时使用的参数,和命令行下相同
"-g", //文件解析到这行时 命令变成 /usr/bin/g++ -g
"helloworld.cpp", // 命令变成 /usr/bin/g++ -g helloworld.cpp
"-o", // 命令变成 /usr/bin/g++ -g helloworld.cpp -o
"hello.exe" //命令变成 /usr/bin/g++ -g helloworld.cpp -o hello.exe
], //到这命令其实就拼接完成了,如果你需要链接其他库,接着添加就行.添加的时候请按照JSON文件格式,不然会报错.
//有的配置文件还有一些别的东西,但是主要的是上面的这些,其他的具体有啥功能,可以百度一下或者看官方文档.官方文档写的很详细.
}
]
}
知道了task,json 的具体功能就是能拼接一条命令之后,看看如何配置cmake 使用cmake时主要使用的命令有两条,一个是cmake 这条命令会生成makefile文件,然后再makefile所在文件下执行mingw32-make.exe 项目就会被构建.所以我们在task.json中主要是能拼接出这两条命令,并且按照先执行第一条后执行第二条的顺序去执行.
{
"version": "2.0.0",
"options": { //指定拼接好的命令在哪个文件目录下执行
"cwd": "${workspaceFolder}/build" //cmake一般习惯于将构建好的东西放在项目目录下面的build目录下
},
"tasks": [ //开始拼接命令,啥时候使用[] 啥时候使用{} 具体的可以看一下JSON文件的格式细节 因为我们其实是有两个命令,所以使用[]
{
"label": "cmake_1", //给这条命令取一个名字,可以随便换
"type": "shell", //告诉vscode 拼接好的这是一条命令
"command": "cmake", //开始拼接 cmake
"args": [
"..", // 命令拼接成: cmake .. 因为我是在项目下面建立了build目录 .. 代表上一级目录也就是我的项目所在路径 应该是可以换成绝对路径的
"-G'MinGW Makefiles'" // 拼接成: cmake .. -G'MinGW Makefiles' 之所以指定这个参数是因为我同时安装了VS Studio 和mingw 不指定的话一般会默认生成MSVC的makefile了,指定之后就成了使用g++编译了.
], //需要指定其他参数的话可以继续添加
"problemMatcher": [],
},
{ //下面拼接第二条命令
"label": "mingw32-make", // 这条命令的名字为"mingw32-make"
"type": "shell",
"command": "mingw32-make.exe", //开始拼接: mingw32-make.exe
"args": [], //不需要指定参数,或者要使用多线程编译的话可以添加 "-j4" 使用4线程编译
"dependsOn":[
"cmake_1" //这个比较关键,就是说这条命令需要等一个名字叫cmake_1(也就是上面那条命令)的命令执行完之后,再执行.
]
},
{
"label": "Build", // 第三个任务,取名叫"Build"
"dependsOn": [
// "cmake",
"mingw32-make" // 现在这个任务依赖一个名字叫"mingw32-make"的命令,要等"mingw32-make"执行完之后再执行.
],
"group": { //下面这些照着抄就行
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false
}
}
]
}
这里面有几个坑,一个是要清楚自己生成哪个类型的makefile,也就是之后你是用哪个编译器编译一个是g++,还有就是VS Studio的MSVC. cmake 的参数 -G’MinGW Makefile’ 可以要可以不要. 另外要的时候, "-G’MinGW Makefiles’ ",必须是双引号里面使用单引号,不能全是双引号,也不能使用转义字符如 “-G\“MinGW Makefiles\” " 另一个就是 mingw32-make 这条命令的"dependsOn"必须要写,必须是先执行玩cmake命令再执行这个命令.有先后顺序.如果在名字为"Build"的这条命令中"dependsOn"中写"cmake”,和 “mingw32-make”,这意味着这两条命令是同时执行的.会报错: 终端将被任务重用,按任意键关闭
插件设置
安装好cmake插件之后,在vscode设置中搜索cmake, 勾选每次生成前清除生成输出 , 和使用task.json生成而非内部进程
launch.json
这个文件的作用是在我们生成helloworld.exe之后(注意是已经生成了,task.json里面的命令拼接之后会自动执行,因此已经生成了helloworld.exe),对helloworld.exe进行调试.支持你在程序中打一些断点什么的.这个文件不复杂:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"preLaunchTask": "Build", //在launch之前运行的任务名,在launch之前,我们需要运行task.json中拼接好的命令."Build"是我们要执行名字为Build的这条,Build又依赖"mingw32-make.exe",所以会先执行"mingw32-make.exe",而"mingw32-make.exe"又依赖命令"cmake_1". 因此"Build"这个名字一定要和task.json中的一样.写错了就找到不任务了.
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/${fileBasenameNoExtension}.exe", //这个就是你要运行哪个程序了. "${workspaceFolder}", "${fileBasenameNoExtension}" 是vs code中定义的变量.具体变量是啥内容下面说.也就是说会进行字符串替换,把"${workspaceFolder}", "${fileBasenameNoExtension}"替换成具体的字符串
"args": [],
"stopAtEntry": false, // 选为true则会在打开控制台后停滞,暂时不执行程序
"cwd": "${workspaceFolder}", // 当前工作路径:当前文件所在的工作空间
"environment": [],
"externalConsole": true, // 是否使用外部控制台,选false的话,我的vscode会出现错误
"MIMode": "gdb",
"miDebuggerPath": "D:\\QT5\\Tools\\mingw730_64\\bin\\gdb.exe", //g++ 编译后,对应的调试器叫gdb,换成你的路径
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}]
}
launch: program "--------------------------.exe"does not exit
这个问题主要就是上面的配置文件中 "program"后面的值不对,跟你实际生成的可执行程序名字不匹配.有两种情况会造成这个报错: 生成的可执行文件名字和program后面跟的程序名字不一样 例如我成生了helloworld.exe 但是呢我program却写的hello.exe 你要gdb运行一个不存在的程序hello.exe 肯定会报错. program的值中使用了${fileBasenameNoExtension}.exe这个字符串 ${fileBasenameNoExtension}这个变量的值会根据你当前正在编辑的文件确定,例如你的光标正在launch.json中,你正在编辑这个文件,然后你按了F5,让程序执行,那${fileBasenameNoExtension}就自动变成了launch, 然后program的值就变成了****\launch.exe. 这个*******launch.exe肯定不存在.解决办法就是你在别的文件中双击一下, 让${fileBasenameNoExtension}变量能正确替换.
c_cpp_properties.json
这个文件的具体作用是在你使用一些外部库的时候,vscode会在你编写代码的时候对这些外部库定义的东西进行自动补全 例如我是用opencv的库,编写的时候想要一些函数能自动补全
{
"configurations": [
{
"name": "win32", //配置名称,默认为系统名,可以自行更改
"includePath": [ //(常用)运行项目包含.h头文件的目录,
"${workspaceFolder}/**",//工作文件下所有定义的一些函数 变量
"E:\\program\\opencv\\4.51\\opencv451_mingw64_install\\include\\opencv2" //能够对opencv的函数 变量进行自动补全 换成你的库
], //添加"compilerPath"后,系统include路径可不写明
"defines": [], //(常用)定义一些需要的变量,等价于在编译时写"-D变量"
"compilerPath": "D:\\QT5\\Tools\\mingw730_64\\bin\\g++", //编译器的路径
"cStandard": "c11", //C标准的版本
"cppStandard": "c++11", //C++标准的版本
"intelliSenseMode": "gcc-x64" //IntelliSense的一些配置,默认即可
}
],
"version": 4
}
vscode中定义的一些常用变量
${workspaceFolder} 你的项目根目录的那个文件夹的路径,一般都是.vscode在哪个文件夹下, 这个变量就是那个文件夹的路径 ${fileBasenameNoExtension} 你现在在vscode中编辑哪个文件,就是输入光标在哪个文件下加入你正在编辑helloworld.cpp,这个变量就是hellworld
上面用到了这俩,先写这俩,其他的可以看看官方文档
以后写完代码就可以改改cmake文件然后愉快的使用F5生成了
|