当前位置: 首页 > article >正文

Ubuntu 环境下的 C/C++ 编译与调试配置

详细教学文档:Ubuntu 环境下的 C/C++ 编译与调试配置

本文档将手把手引导你完成在 Ubuntu 环境中设置 VS Code 的 tasks.jsonlaunch.json,实现以下目标:

  1. 统一管理输出文件:将所有编译生成的可执行文件统一存放到项目的 build 目录。
  2. 优化调试流程:调试器自动定位 build 中的可执行文件,免去手动调整路径的麻烦。
  3. 跨平台兼容性:确保配置适用于 Ubuntu 和其他类 Unix 系统。

目录

  1. 前提条件
  2. 创建项目目录结构
  3. 配置 tasks.json
  4. 配置 launch.json
  5. 使用步骤
  6. 常见问题排查
  7. 最终效果总结

前提条件

在开始之前,请确保系统已安装以下工具:

  1. g++ 编译器
    安装命令:

    sudo apt install g++
    
  2. gdb 调试器
    安装命令:

    sudo apt install gdb
    
  3. VS Code 扩展

    • C/C++ 插件(Microsoft 提供):在扩展市场中搜索 “C/C++” 并安装。

创建项目目录结构

建议项目目录结构如下:

project-root/
├── build/           # 编译生成的可执行文件目录
├── src/             # 源代码文件目录
│   ├── main.cpp     # 示例源代码文件
├── tasks.json       # VS Code 任务配置文件
└── launch.json      # VS Code 调试配置文件

执行以下命令创建目录结构:

mkdir -p project-root/build
mkdir -p project-root/src

将你的源代码放入 src 目录,例如创建一个简单的 main.cpp

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

配置 tasks.json

文件路径

tasks.json 保存到项目目录下的 .vscode 文件夹中。如果文件夹不存在,使用以下命令创建:

mkdir -p project-root/.vscode
touch project-root/.vscode/tasks.json
完整配置内容
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 编译到 build 目录 (Ubuntu)",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",   // 彩色错误提示
                "-g",                          // 启用调试信息
                "${workspaceFolder}/src/${fileBasename}", // 指定源文件路径
                "-o",                          // 输出选项
                "${workspaceFolder}/build/${fileBasenameNoExtension}" // 输出文件路径
            ],
            "options": {
                "cwd": "${workspaceFolder}"     // 设置工作目录为项目根目录
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true              // 默认构建任务
            },
            "detail": "将当前活动文件编译到 build 目录中"
        }
    ]
}
关键解释
  1. ${workspaceFolder}:指代项目根目录。
  2. ${fileBasename}:当前活动文件的文件名(包括扩展名)。
  3. ${fileBasenameNoExtension}:当前活动文件的文件名(不包括扩展名)。
  4. -g:开启调试符号,支持调试功能。

配置 launch.json

文件路径

launch.json 保存到 .vscode 文件夹中:

touch project-root/.vscode/launch.json
完整配置内容
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++ Runner: Debug Session",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/${fileBasenameNoExtension}", // 指向 build 中的可执行文件
      "args": [],                           // 可选参数,留空
      "stopAtEntry": false,                 // 是否在入口处停止
      "cwd": "${workspaceFolder}/build",    // 调试时的工作目录
      "environment": [],                    // 环境变量
      "externalConsole": false,             // 使用内嵌终端
      "MIMode": "gdb",                      // 使用 gdb 调试
      "miDebuggerPath": "/usr/bin/gdb",     // gdb 路径
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}
关键解释
  1. program:动态指向 build 目录中的可执行文件,自动根据源文件名匹配。
  2. cwd:调试器工作目录,设置为 build
  3. miDebuggerPath:指定调试器路径。

使用步骤

1. 编译程序
  1. 打开源文件,例如 src/main.cpp
  2. 按快捷键 Ctrl + Shift + B 或从菜单中选择 任务 -> 运行任务
  3. 确保可执行文件生成到 build 目录,例如 build/main
2. 调试程序
  1. 按快捷键 F5 或从菜单中选择 运行 -> 启动调试
  2. 程序将在 build 目录下运行,调试器会附加到进程。

常见问题排查

问题 1:g++gdb 未安装

解决方法

sudo apt install g++ gdb
问题 2:build 目录不存在或无写权限

解决方法

mkdir -p build
chmod +w build
问题 3:调试时程序无法找到输入文件

原因:默认工作目录为 build
解决方法:将输入文件复制到 build 目录,或使用绝对路径。


最终效果总结

  1. 统一输出路径:所有可执行文件存储在 build 目录,管理更清晰。
  2. 一键调试:按 F5 即可运行调试,无需手动配置路径。
  3. 易于扩展:适用于多文件项目,通过修改 tasks.jsonargs 增加编译参数即可支持复杂构建需求。

祝你使用愉快!


http://www.kler.cn/a/417875.html

相关文章:

  • ASP.NET Core 负载/压力测试
  • vue3中 axios 发送请求 刷新token 封装axios
  • Javascript中DOM事件监听 (鼠标事件,键盘事件,表单事件)
  • 算法编程题-煎饼排序 不含AAA或者BBB的字符串
  • 【Android】EventBus的使用及源码分析
  • 分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用
  • “移门缓冲支架:为家庭安全加码”
  • 以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式
  • 医院数据库优化:提升性能与响应时间的关键策略
  • PostgreSQL实现透视表查询
  • Android启动流程,代码分析
  • 欢迪迈手机商城:基于SpringBoot的数据分析
  • RK3568平台开发系列讲解(PWM篇)PWM 子系统框架
  • vulnhub靶场【哈利波特】三部曲之Fawkes
  • 解决 Ubuntu 20.04 上的 torchvisionnms 运行时错误 详细步骤与分析
  • golang使用gos7读取S7200Smart数据
  • 关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务
  • Java 泛型详细解析
  • YOLO-学习笔记
  • 算法笔记:力扣148. 排序链表
  • 大模型学习方法之——大模型技术学习路线
  • Hutool 秒速实现 2FA 两步验证
  • How to install mac application by homebrew
  • Oracle12.2 RAC集群管理之增加删除节点(DNS解析)
  • 区块链技术如何改变我们的日常生活?
  • 生产环境中:Flume 与 Prometheus 集成