vscode如何debug Makefile或cmake组织的c/c++项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

VSCode是一款微软出的轻量级编辑器。
本文主要介绍通过makefile和cmake组织的c语言工程如何debug。


demo文件

main.c

#include <stdio.h>
#include "func.h"
int main() {
	printf("helloworld\n");
    test();
    return 0;
}

func.h

#include <stdio.h>
void test();

func.c

#include "func.h"
void test() {
    for (int i = 0; i < 10; i++) {
        printf("%d\n", i);
    }
}

Makefile

# -g -Wall是必须的
main:main.c test.c
	gcc -o main main.c test.c -g -Wall

操作步骤

  1. vscode的安装(略)
  2. 安装c/c++插件
  3. ctrl+shift+p->c/c++:Edit Configurations(UI)->生成c_cpp_properties.json(如果用clangd进行代码补全,这一步忽略)
  4. ctrl+shift+p->Tasks: Configure Default Build Task->生成tasks.json
  5. 右击main.c点Add Debug Configuration->生成launch.json
  6. 查看c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "cStandard": "c11",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "configurationProvider": "ms-vscode.makefile-tools"
        }
    ],
    "version": 4
}
  1. 修改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": "gcc - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            # 修改program为具体的可执行文件
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            # 修改preLaunchTask为tasks中的label名
            "preLaunchTask": "build",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}
  1. 修改tasks.json
{
    "tasks": [
        {
            "type": "shell",
            # 修改label
            "label": "build",
            # 修改command
            "command": "make",
            # 注释掉args
            // "args": [
            //     "-fdiagnostics-color=always",
            //     "-g",
            //     "${file}",
            //     "-o",
            //     "${fileDirname}/${fileBasenameNoExtension}"
            // ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}
  1. F5进行debug

具体案例

提供最新的launch.json和tasks.json,这样以后就可以直接复制而不必每次都像上面的生成原始文件再修改,同时提供的还有settings.json文件用于配置clangd

Makefile案例

launch.json

{
    "version": "0.2.0",   // 使用的 launch.json 版本

    "configurations": [   // 配置调试器的配置列表
        {
            "name": "C++ Debug with lldb",   // 调试器配置的名称,可以自定义
            "type": "cppdbg",   // 调试器类型为 C++ 调试
            "request": "launch",   // 请求启动调试会话
            "program": "${workspaceFolder}/main",   // 可执行文件的路径,主要的修改点

            // 程序启动时的参数
            "args": [],

            "stopAtEntry": false,   // 是否在程序入口处停止

            "cwd": "${workspaceFolder}",   // 工作目录
            "environment": [],   // 环境变量设置
            "externalConsole": false,   // 是否使用外部控制台

            // 使用 lldb 调试器,如果使用gdb调试,换成gdb
            "MIMode": "lldb",

            // 配置 lldb 的初始化命令,启用漂亮打印
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for lldb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],

            // 在启动调试会话之前运行的任务(在 tasks.json 中配置)
            "preLaunchTask": "Build",

            // lldb-mi 调试器的路径,如果使用gdb调试,换成gdb的路径
            "miDebuggerPath": "/usr/lib/llvm-6.0/bin/lldb-mi"
        }
    ]
}

tasks.json

{
    "version": "2.0.0",   // 使用的 tasks.json 版本

    "tasks": [   // 配置任务列表
        {
            "label": "Build",   // 任务的标签,用于在 Visual Studio Code 中显示
            "type": "shell",   // 任务类型为 shell 命令
            "command": "make",   // 要执行的命令
            "group": {   // 任务分组信息
                "kind": "build",   // 将任务分组为构建类型
                "isDefault": true   // 设置为默认任务
            }
        }
    ]
}

cmake案例

cmake工程的launch.json和makefile工程基本类似,主要就是修改可执行文件路径

launch.json

{
    "version": "0.2.0",   // 使用的 launch.json 版本

    "configurations": [   // 配置调试器的配置列表
        {
            "name": "C++ Debug with lldb",   // 调试器配置的名称,可以自定义
            "type": "cppdbg",   // 调试器类型为 C++ 调试
            "request": "launch",   // 请求启动调试会话
            "program": "${workspaceFolder}/build/main",   // 可执行文件的路径,主要的修改点

            // 程序启动时的参数
            "args": [],

            "stopAtEntry": false,   // 是否在程序入口处停止

            "cwd": "${workspaceFolder}",   // 工作目录
            "environment": [],   // 环境变量设置
            "externalConsole": false,   // 是否使用外部控制台

            // 使用 lldb 调试器,如果使用gdb调试,换成gdb
            "MIMode": "lldb",

            // 配置 lldb 的初始化命令,启用漂亮打印
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for lldb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],

            // 在启动调试会话之前运行的任务(在 tasks.json 中配置)
            "preLaunchTask": "CMake Build",

            // lldb-mi 调试器的路径,如果使用gdb调试,换成gdb的路径
            "miDebuggerPath": "/usr/lib/llvm-6.0/bin/lldb-mi"
        }
    ]
}

tasks.json

cmake工程的tasks.json和makefile工程的主要区别就是任务有两步,分别是相当于cmake ..make。调试的时候launch.json中的preLaunchTask要为第二个任务的lable

{
    "version": "2.0.0",   // 使用的 tasks.json 版本

    "tasks": [   // 配置任务列表
        {
            "label": "CMake Configure",   // 任务的标签,用于在 Visual Studio Code 中显示
            "type": "shell",   // 任务类型为 shell 命令
            "command": "cmake",   // 要执行的命令
            "args": ["${workspaceFolder}"],   // 命令的参数,这里是配置 CMake
            "group": {   // 任务分组信息
                "kind": "build",   // 将任务分组为构建类型
                "isDefault": true   // 设置为默认任务
            }
        },
        {
            "label": "CMake Build",   // 任务的标签
            "type": "shell",   // 任务类型为 shell 命令
            "command": "cmake",   // 要执行的命令
            "args": ["--build", "${workspaceFolder}/build"],   // 命令的参数,这里是构建 CMake
            "group": {   // 任务分组信息
                "kind": "build",   // 将任务分组为构建类型
                "isDefault": true   // 设置为默认任务
            }
        }
    ]
}

settings.json

clangd的配置Makefile工程和cmake工程可以用相同的。关于clangd的安装和配置参考我的另一篇博客ubuntu系统vscode配置clangd

{
    // 指定 clangd 可执行文件的路径(如果在系统路径中可直接使用 "clangd""clangd.path": "clangd",

    // 作为编译失败的备选标志,指定了包含文件夹的路径
    "clangd.fallbackFlags": [
        "-I${workspaceFolder}/include"
    ],

    // 配置 clangd 启动参数
    "clangd.arguments": [
        "--background-index",        // 启用后台索引
        "--compile-commands-dir=${workspaceFolder}",  // 设置编译命令文件夹
        "--all-scopes-completion",   // 允许在所有作用域中进行代码补全
        "--completion-style=detailed",  // 详细模式的代码补全
        "--clang-tidy",              // 启用 Clang-Tidy 静态代码分析
        "--log=verbose",             // 输出详细的日志信息
        "--pretty"                   // 漂亮的输出格式
    ],

    // 配置 CMake 构建目录
    "cmake.buildDirectory": "${workspaceFolder}/build",

    // 配置 CMake 构建环境变量,使其生成编译命令数据库
    "cmake.buildEnvironment": {
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
    }
}

<think>好的,用户想知道在Linux系统下使用VSCode结合CMake管理C/C++工程时,是否可以不用JSON配置文件。首先,我需要确认VSCodeCMake的基本工作流程。 CMake本身是通过CMakeLists.txt文件来管理项目的构建过程,生成对应的Makefile其他构建系统的文件。而VSCode通常通过插件如CMake Tools来集成CMake,这时候插件可能会生成依赖一些JSON配置文件,比如cmake-kits.json、settings.json等。不过,用户的问题是不使用JSON是否可以。 接下来,我需要考虑用户可能的情况。他们可能希望尽量减少配置文件的数量,者对JSON配置不熟悉,想用纯CMake管理。这时候需要明确,虽然VSCode的插件可能会自动生成一些JSON文件,但用户不一定需要手动编辑这些文件。核心的构建配置仍然由CMakeLists.txt处理。 然后,应该解释即使不手动配置JSON,VSCodeCMake Tools插件可能还是会自动生成必要的配置。用户如果不希望接触这些JSON文件,可以忽略它们,专注于CMakeLists.txt。但如果有特殊需求,比如指定编译器构建类型,可能还是需要调整JSON设置,不过这不是强制性的。 另外,用户可能有更深层的需求,比如简化项目结构,者避免维护多个配置文件。需要说明CMake本身足够强大,可以处理大多数构建需求,而VSCode的集成主要是为了便捷,不是必须依赖JSON的。 最后,需要给出步骤指导,如何在不手动配置JSON的情况下使用VSCodeCMake,以及可能需要的注意事项,比如插件自动生成的配置是否会影响项目,如何通过CMakeLists.txt覆盖这些设置等。确保用户了解核心在于CMake,而JSON只是辅助,可以按需选择是否使用。</think>在Linux系统下使用VSCode配合CMake管理C/C++工程时,完全可以不使用JSON配置文件。以下是具体说明: --- ### **一、基本原理** 1. **CMake核心地位** - CMake通过`CMakeLists.txt`文件实现工程管理 - 自动生成构建系统文件(如Makefile) - 不依赖任何JSON文件即可完成完整构建流程 2. **VSCode的辅助角色** - 通过CMake Tools插件提供可视化操作 - 自动生成的`.vscode/`目录下的JSON文件(如`settings.json`)仅用于IDE配置 - 这些JSON文件不是CMake工程管理的必要条件 --- ### **二、不依赖JSON的实践方案** #### **步骤1:基础工程结构** ```bash my_project/ ├── CMakeLists.txt ├── src/ │ └── main.cpp └── build/ # 构建目录(可自动创建) ``` #### **步骤2:CMake配置示例** ```cmake # CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(MyProject) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(${PROJECT_NAME} src/main.cpp ) ``` #### **步骤3:VSCode操作流程** 1. 安装必要插件: - CMake Tools(核心) - C/C++(IntelliSense支持) 2. 快捷键操作: - `Ctrl+Shift+P` → `CMake: Configure` 配置项目 - `Ctrl+Shift+P` → `CMake: Build` 执行编译 - `F5` 直接启动调试 --- ### **三、JSON文件的作用(可选项)** 虽然不强制使用,但了解其用途有助于高级配置: 1. `cmake-kits.json`:编译器套件配置 ```json { "name": "GCC 11", "compilers": { "C": "/usr/bin/gcc", "CXX": "/usr/bin/g++" } } ``` 2. `settings.json`:工作区设置 ```json { "cmake.buildDirectory": "${workspaceFolder}/build", "cmake.configureArgs": ["-DCMAKE_BUILD_TYPE=Debug"] } ``` --- ### **四、优势对比** | 方式 | 优点 | 缺点 | |--------------|-----------------------------|------------------------| | 纯CMake | 跨平台统一配置,无IDE依赖 | 需要记忆CMake命令 | | CMake+JSON | 可视化操作方便,可保存个性化设置 | 增加配置文件维护成本 | --- ### **五、典型场景建议** 1. **简单项目**:完全依赖`CMakeLists.txt`即可 2. **团队协作**:建议将`.vscode/`加入`.gitignore` 3. **特殊需求**:需要交叉编译自定义工具链时,可选择性使用JSON配置 > 📌 关键结论:CMake本身不依赖JSON文件,VSCode的JSON配置仅用于增强开发体验而非必需。建议优先通过`CMakeLists.txt`实现工程管理,仅在需要IDE特殊配置时使用JSON。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值