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 增加编译参数即可支持复杂构建需求。

祝你使用愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DevOps引领数字化转型新趋势

DevOps帮助数字化转型 在数字化转型的大潮中&#xff0c;DevOps作为一种文化、运动和实践&#xff0c;已经成为推动企业快速适应市场变化、提高竞争力的关键因素。DevOps的核心在于打破开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;之间的…

ctfshow

1,web21 Basic认证采用Base64加密方式&#xff0c;Base64解码字符串发现是 用户名:密码 的格式进行Base64编码。 密码shark63 2,web22 用 子域名扫描器 扫出flag.ctf.show拿到flag&#xff0c;但这个域名已经没了所以就直接交的官方提供的flag。 3,web23 这段PHP代码是一个简单…

从 0 到 1 掌握部署第一个 Web 应用到 Kubernetes 中

文章目录 前言构建一个 hello world web 应用项目结构项目核心文件启动项目 检查项目是否构建成功 容器化我们的应用编写 Dockerfile构建 docker 镜像推送 docker 镜像仓库 使用 labs.play-with-k8s.com 构建 Kubernetes 集群并部署应用构建 Kubernetes 集群环境编写部署文件 总…

数据结构与算法——1120——时间空间效率问题求边界值

目录 1、效率问题 1、时间复杂度 1、O(1) 2、O(n) 3、O(n) 或O(n*log2n)——n倍的log以2为底n的对数 例题 4、O(n) 2、空间复杂度 3、数组和链表 2、面试题之求边界值 题目 解答 &#xff08;1&#xff09;-i &#xff08;2&#xff09;~i &#xff08;3&#x…

爬虫与反爬-Ja3指纹风控(Just a moment...)处理方案及参数说明

概述&#xff1a;本文将针对 Ja3 指纹检测风控进行处理&#xff0c;举例了一个案例并使用两种不同的破解方案进行突破&#xff0c;同时深入了解指纹间不同字符所代表的含义 指纹检测背景&#xff1a; 1、每一个设备、软件都有独属于自己的设备信息、版本号、加密算法、椭圆算…

【JUC-JMM】Java Memory Model Java内存模型

Java内存模型--JMM 一、JMM是什么&#xff1f;二、Happens-Before原则三、JMM有什么用&#xff1f; 一、JMM是什么&#xff1f; JMM&#xff0c;全拼Java Memory Model&#xff0c;翻译过来就是Java内存模型。 那么&#xff0c;我们不禁思索&#xff0c;Java内存模型有什么用&…

SpringAI:Java 开发的智能新利器

一、SpringAI 简介 随着人工智能技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平。Spring AI 正是为 Java 开发者提供的一款强大的 AI 框架&#xff0c;使得这一集成过程变得前所未有的简单和高效。 本文将深入探…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表&#xff0c;录入的日期格式很混乱&#xff0c;有些看着差不多&#xff0c;但实际多一个空格少一个字符很难发现&#xff0c;希望的理想格式是 1980-01-01&#xff0c;10位&#xff0c;即&#xff1a;“YYYY-mm-dd”&#xff0c;实际上数据表中这样的格式都有 19…

【我在CSDN成长】我的五周年创作纪念日

感叹 五年的时光匆匆而过&#xff0c; 像一阵风&#xff0c;拂过岁月的湖面&#xff0c; 泛起层层涟漪&#xff0c;又悄然离去。 曾经的欢笑与泪水&#xff0c; 那些奋斗的日夜&#xff0c; 如同电影般在脑海中放映&#xff0c; 却已成为遥远的回忆。 五年&#xff0c;说长不长…

Jmeter中的定时器

4&#xff09;定时器 1--固定定时器 功能特点 固定延迟&#xff1a;在每个请求之间添加固定的延迟时间。精确控制&#xff1a;可以精确控制请求的发送频率。简单易用&#xff1a;配置简单&#xff0c;易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求…

BERT 详解

BERT简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由 Google 在 2018 年提出的一种预训练语言模型。BERT 在自然语言处理&#xff08;NLP&#xff09;领域取得了重大突破&#xff0c;因为它能够有效地捕捉文本的上下文信息&am…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色&#xff0c;与整体不协调。 修改方式如下&#xff1a;

数据库-MySQL-Dynamic-Datasource源码解析

文章目录 前言一、简介二、整体流程三、核心解析四、总结 前言 多数据源的应用在日常项目中也是很常见的场景。 dynamic-datasource的功能&#xff0c;用起来的确很方便&#xff0c;只需要一个DS注解&#xff0c;加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的…

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能&#xff0c;可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧&#xff01; 首先…

架构-微服务架构

文章目录 前言一、系统架构演变1. 单体应用架构2. 垂直应用架构3. 分布式架构4. SOA 架构5. 微服务架构 二. 微服务架构介绍1. 微服务架构的常见问题2. 微服务架构的常见概念3. 微服务架构的常见解决方案4. 解决方案选型 三. Spring Cloud Alibaba介绍1. 主要功能2. 组件 前言 …

【一个简单的整数问题2——线段树】

题目 代码 下面的两个代码的区别在于modify的分类&#xff0c;modify最简单的分类方式是存在性分类&#xff0c;另一种类似某些query采用的三段式分类&#xff0c;详细见代码 存在性 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

构建英语知识网站:Spring Boot框架解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Android mk/bp构建工具介绍

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…