VSCODE配置使用cmake构建c++项目

VSCODE配置使用cmake构建c++项目

准备工具

具体如何下载,大家百度一下就行,具体说一下配置细节.

  1. vscode (要安装cmake和cmake tools插件 不安装也行,主要是cmake tools 会有cmake语法补全, 而cmake tools 依赖cmake插件)
  2. cmake
  3. mingw (当前要是有QT等使用QT下的mingw也行)(需要把里面的bin目录添加到环境变量当中)

具体配置

vscode下需要在你项目根目录新建一个.vscode文件夹(也可以自动生成,就按照最简单的办法说),然后在这个目录下一般需要配置三个文件.稍后详细介绍:

  1. 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生成而非内部进程
VSCODE配置使用cmake构建c++项目_第1张图片


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生成了

你可能感兴趣的:(c++,vscode)