1.源文件

1.src/main.cpp

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

2.CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(cmake-demo VERSION 1.0.0 LANGUAGES CXX)

# C++ 标准设置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 可执行文件
add_executable(${PROJECT_NAME}
    src/main.cpp
)

2.初步测试

配置好CMakeLists.txt之后可以使用cmake插件执行一遍以确保cmake无误

  1. 点击快捷键Ctrl+Shift+P,输入CMake:Select a kit,选择你想要的编译器
    在这里插入图片描述
  2. 点击快捷键Ctrl+Shift+P,输入CMake:Configure
    在这里插入图片描述
  3. 点击快捷键Ctrl+Shift+P,输入CMake:Build
    或者点击左下角的Build按键在这里插入图片描述
    在这里插入图片描述
  4. 点击左下角的执行
    在这里插入图片描述
    在这里插入图片描述
  5. 先在代码上打断点,然后点击左下角的调试
    在这里插入图片描述
    进入调试后可以看到Debug Console有输出stdout,Call Stack可以看到调用栈
    在这里插入图片描述

3.创建Preset

1.创建Configure Preset

  1. 点击快捷键Ctrl+Shift+P,输入CMake:Add Configure Preset

  2. 选择Create from Compilers在这里插入图片描述

  3. 选择编译器在这里插入图片描述

  4. 输出configure的名字
    在这里插入图片描述

  5. 可以看到CMakePresets.json已经被生成了
    在这里插入图片描述

  6. 但还需要做一些修改

  • 降低版本为6
  • 删除install
  • 由于gcc,g++已经在环境变量中,因此可以删除绝对路径,也可以删除.exe后缀
  • 指定make工具,由于我已经安装了mingw,因此mingw的bin目录下有了mingw32-make.exe,当然为了方便使用,也可以将mingw32-make.exe改名为make.exe
{
    "version": 6,
    "configurePresets": [
        {
            "name": "mingw",
            "displayName": "GCC 9.2.0 mingw32",
            "description": "Using compilers: gcc, g++",
            "generator": "MinGW Makefiles",
            "binaryDir": "${sourceDir}/build/${presetName}",
            "cacheVariables": {
                "CMAKE_C_COMPILER": "gcc",
                "CMAKE_CXX_COMPILER": "g++",
                "CMAKE_MAKE_PROGRAM": "mingw32-make",
                "CMAKE_BUILD_TYPE": "Debug"
            }
        }
    ]
}
  1. .vscode/settings.json

注意args的–preset参数值必须与CMakePresets.json配置的configure preset的name对应

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "CMake: configure (mingw)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--preset",
                "mingw"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": []
        }
    ]
}
  1. 执行task CMake: configure (mingw)
    点击Ctrl+Shift+P,输入Tasks: Run Task,选择CMake: configure (mingw),看到如下输出,说明configure成功
    在这里插入图片描述

2.创建Build Preset

  1. CMakePresets.json
    添加这一段到CMakePresets.json,注意逗号和json格式
    "buildPresets": [
        {
            "name": "mingwbuild",
            "displayName": "Build with MinGW",
            "description": "Build the project using the mingw configure preset.",
            "configurePreset": "mingw"
        }
    ]
  1. .vscode/settings.json
    添加这一段到.vscode/settings.json,注意逗号和json格式
  • 注意args的–preset参数值必须与CMakePresets.json配置的build preset的name对应
  • 注意dependsOn的值必须与tasks.json里配置的configure的task的name对应
{
            "label": "CMake: build (mingw build)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--build",
                "--preset",
                "mingwbuild"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "dependsOn": [
                "CMake: configure (mingw)"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        }
  1. 执行task CMake: configure (mingw)
    点击Ctrl+Shift+P,输入Tasks: Run Task,选择CMake: build (mingw build),看到如下输出,说明build成功
    在这里插入图片描述

4.创建调试

1 .vscode/launch.json

  • 注意program的路径必须与CMakePresets.json配置的configure的binaryDir的路径匹配,且文件名必须与CMakeLists.txt配置的add_executable的可执行程序名匹配
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug cmake-demo (MinGW)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/mingw/cmake-demo",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "gdb",
      "preLaunchTask": "CMake: build (mingw build)",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

2.执行调试

在源文件上打断点,然后Run And Debug界面的下拉框中找到Debug cmake-demo (MinGW)
然后点击执行
在这里插入图片描述
打开Debug Console控制台看到输出,说明调试成功
在这里插入图片描述

5.配置多个编译器

  1. 使用clang用于编译,使用ninja作为make工具
  2. llvm下载地址llvm release
  3. ninja 下载地址ninja release,下载后解压,将ninja.exe放到环境变量的PATH路径中

1.CMakePresets.json

  1. 新增一个configure preset
{
    "name": "ninja-clang",
    "displayName": "Ninja with clang++",
    "generator": "Ninja",
    "binaryDir": "${sourceDir}/build/${presetName}",
    "cacheVariables": {
        "CMAKE_CXX_COMPILER": "clang++",
        "CMAKE_C_COMPILER": "clang",
        "CMAKE_MAKE_PROGRAM": "ninja",
        "CMAKE_BUILD_TYPE": "Debug"
    }
}
  1. 新增一个build preset
{
     "name": "clangbuild",
     "displayName": "Build with Ninja/Clang",
     "description": "Build the project using the ninja-clang configure preset.",
     "configurePreset": "ninja-clang"
 }

2 .vscode/tasks.json

  1. 新增一个configure的task
 {
     "label": "CMake: configure (ninja-clang)",
     "type": "shell",
     "command": "cmake",
     "args": [
         "--preset",
         "ninja-clang"
     ],
     "options": {
         "cwd": "${workspaceFolder}"
     },
     "problemMatcher": []
 }
  1. 新增一个build的task
        {
            "label": "CMake: build (clang build)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--build",
                "--preset",
                "clangbuild"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "dependsOn": [
                "CMake: configure (ninja-clang)"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        }

3 .vscode/launch.json

{
  "name": "Debug cmake-demo (Ninja/Clang)",
  "type": "cppvsdbg",
  "request": "launch",
  "program": "${workspaceFolder}/build/ninja-clang/cmake-demo",
  "args": [],
  "stopAtEntry": true,
  "cwd": "${workspaceFolder}",
  "environment": [],
  "externalConsole": false,
  "preLaunchTask": "CMake: build (clang build)"
}

6.最终的文件如下

1.src/main.cpp

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

2.CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(cmake-demo VERSION 1.0.0 LANGUAGES CXX)

# C++ 标准设置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 可执行文件
add_executable(${PROJECT_NAME}
    src/main.cpp
)

3.CMakePresets.json

{
    "version": 6,
    "configurePresets": [
        {
            "name": "mingw",
            "displayName": "GCC 9.2.0 mingw32",
            "description": "Using compilers: gcc, g++",
            "generator": "MinGW Makefiles",
            "binaryDir": "${sourceDir}/build/${presetName}",
            "cacheVariables": {
                "CMAKE_C_COMPILER": "gcc",
                "CMAKE_CXX_COMPILER": "g++",
                "CMAKE_MAKE_PROGRAM": "mingw32-make",
                "CMAKE_BUILD_TYPE": "Debug"
            }
        },
        {
            "name": "ninja-clang",
            "displayName": "Ninja with clang++",
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/build/${presetName}",
            "cacheVariables": {
                "CMAKE_CXX_COMPILER": "clang++",
                "CMAKE_C_COMPILER": "clang",
                "CMAKE_MAKE_PROGRAM": "ninja",
                "CMAKE_BUILD_TYPE": "Debug"
            }
        }
    ],
    "buildPresets": [
        {
            "name": "mingwbuild",
            "displayName": "Build with MinGW",
            "description": "Build the project using the mingw configure preset.",
            "configurePreset": "mingw"
        },
        {
            "name": "clangbuild",
            "displayName": "Build with Ninja/Clang",
            "description": "Build the project using the ninja-clang configure preset.",
            "configurePreset": "ninja-clang"
        }
    ]
}

4 .vscode/tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "CMake: configure (mingw)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--preset",
                "mingw"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": []
        },
        {
            "label": "CMake: build (mingw build)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--build",
                "--preset",
                "mingwbuild"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "dependsOn": [
                "CMake: configure (mingw)"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        },
        {
            "label": "CMake: configure (ninja-clang)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--preset",
                "ninja-clang"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": []
        },
        {
            "label": "CMake: build (clang build)",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--build",
                "--preset",
                "clangbuild"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "dependsOn": [
                "CMake: configure (ninja-clang)"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}

5 .vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug cmake-demo (MinGW)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/mingw/cmake-demo",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "gdb",
      "preLaunchTask": "CMake: build (mingw build)",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    },
    {
      "name": "Debug cmake-demo (Ninja/Clang)",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/ninja-clang/cmake-demo",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "preLaunchTask": "CMake: build (clang build)"
    }
  ]
}

更多推荐