在 Ubuntu 中用 VSCode 配置 C 语言项目的编译与调试(详解教程)

news2024/11/20 0:24:36

目录

    • 一、准备工作
    • 二、配置 VSCode 的编译任务
    • 三、配置 VSCode 的调试任务
    • 四、编译与调试流程
    • 五、常见问题排查
    • 六、总结

在 C 语言开发过程中,调试与编译是不可缺少的环节,而 VSCode(Visual Studio Code)作为一个强大且轻量级的编辑器,结合 gcc 和 gdb,可以高效地完成 C 语言项目的开发和调试工作。本文将详细介绍如何在 Ubuntu 环境下,用 VSCode 配置一个 C 项目的编译和调试环境。

一、准备工作

1. 安装必要工具
在开始之前,确保你的系统已经安装了以下工具:

VSCode:通过终端安装:

sudo apt update
sudo apt install code

GCC 和 GDB:用于编译和调试 C 程序。

sudo apt install build-essential gdb

VSCode C/C++ 插件:打开 VSCode,点击左侧扩展(Extensions)图标,搜索 C/C++,安装由 Microsoft 提供的插件。

2. 准备项目文件
将你的 C 项目文件放在一个独立的目录中。例如:

~/AGC/test_AGC/

项目文件结构示例如下:

test_AGC/
├── agc.c
├── agc.h
├── dr_wav.h
├── WebRTC_AGC.c
└── build/  # 用于存放编译输出文件

二、配置 VSCode 的编译任务

为了方便管理项目,我们需要在 VSCode 中配置编译任务。这些任务会自动调用 gcc,将源代码编译成可执行文件,并输出到指定目录中。

1. 创建 tasks.json
在项目的根目录下新建 .vscode/tasks.json 文件,内容如下:

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: gcc build Debug version",
			"command": "/usr/bin/gcc",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"${file}",
				"-o",
				"${workspaceFolder}/build/Debug/outDebug"
			],
			"options": {
				"cwd": "${workspaceFolder}"
			},
			"problemMatcher": ["$gcc"],
			"group": {
				"kind": "build",
				"isDefault": true
			},
			"detail": "Generated build task for Debug version",
			"dependsOn": ["createBuildDir"]
		},
		{
			"label": "createBuildDir",
			"type": "shell",
			"command": "mkdir",
			"args": ["-p", "${workspaceFolder}/build/Debug"],
			"problemMatcher": []
		}
	]
}

2. 配置说明
label:任务名称,可用于在任务面板中调用。
command:指定编译器路径,这里是 /usr/bin/gcc。
args:
-g:生成包含调试信息的可执行文件。
${file}:表示当前正在编辑的 C 文件。
-o:指定输出文件路径,这里是 build/Debug/outDebug。
dependsOn:确保在编译前自动创建目标目录 build/Debug。
cwd:设置当前工作目录为项目的根目录 ${workspaceFolder}。
3. 执行编译任务
按下 Ctrl+Shift+B 或通过菜单选择 Terminal -> Run Build Task。如果任务配置正确,将会生成编译输出文件:

~/AGC/test_AGC/build/Debug/outDebug

三、配置 VSCode 的调试任务

有了编译任务之后,我们需要为项目配置调试器,以便单步运行代码、设置断点、查看变量等。

1. 创建 launch.json
在项目的 .vscode 文件夹中,创建一个名为 launch.json 的文件,内容如下:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++ Runner: Debug Session",
      "type": "cppdbg",
      "request": "launch",
      "args": [],
      "stopAtEntry": false,
      "externalConsole": false,
      "cwd": "${workspaceFolder}",
      "program": "${workspaceFolder}/build/Debug/outDebug",
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

2. 配置说明
program:指定调试目标文件路径,需与编译输出路径一致。
cwd:调试时的工作目录,通常设置为项目根目录。
MIMode:调试模式,使用 gdb。
miDebuggerPath:gdb 的路径,通常为 /usr/bin/gdb。

四、编译与调试流程

1. 执行编译任务
在 VSCode 中,按 Ctrl+Shift+B 执行编译任务,生成可执行文件 build/Debug/outDebug。如果一切正常,在终端中运行以下命令可以看到生成的文件:

ls ~/AGC/test_AGC/build/Debug/

输出示例:

outDebug

2. 设置断点
打开 agc.c 文件,点击行号左侧的空白区域,添加断点(红点会显示出来)。

3. 启动调试
按下 F5 或点击调试按钮(虫子图标),选择 C/C++ Runner: Debug Session。调试器将启动,并在断点处暂停。

五、常见问题排查

1. 编译失败:找不到输出目录
如果遇到错误:

/usr/bin/ld: cannot open output file ...: No such file or directory

这是因为目标目录不存在。确保 tasks.json 中已包含 mkdir 命令,或手动运行以下命令:

mkdir -p ~/AGC/test_AGC/build/Debug

2. 中文路径问题
如果路径中有中文字符(如 桌面),可能会导致工具解析失败。建议将项目移动到全英文路径下,如:

mkdir -p ~/projects
mv ~/AGC/test_AGC ~/projects/

3. 调试器无法启动
如果调试器提示:

launch: program ... does not exist

请确保 launch.json 中的 program 路径与实际编译输出路径一致。

六、总结

通过以上配置,VSCode 已经成为一个强大的 C 语言开发环境。无论是编译还是调试,都可以在一个统一的界面中完成。以下是完整的操作流程回顾:

在 VSCode 中配置 tasks.json,自动编译 C 代码。
在 VSCode 中配置 launch.json,设置调试器。
使用 Ctrl+Shift+B 进行编译,按 F5 进入调试模式。
利用断点和调试器功能,快速定位和解决代码中的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速,数据中心网络正在迅速发展以跟上步伐。对于许多企业来说,400GbE 甚至 800GbE 正在成为标准选择,因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

怀旧游戏打卡清单(TODO)

感觉忙碌了好久好久,真的好想休息一下。。 整理一下将来休息时候的打卡清单,不工作了去个海边狂打游戏,想想就惬意啊。当然,最好找个work from home,去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说&#xf…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果: – 使用Pygame模拟粒子运动,粒子会以爱心的轨迹分布并运动。爱心公式: 爱心的数学公式: x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果: 粒子…

使⽤MATLAB进⾏⽬标检测

目录 数据准备定义模型并训练用测试集评估性能推理过程⼀⾏代码查看⽹络结构⼀⾏代码转onnx结语 ⼈⽣苦短,我⽤MATLAB。 Pytorch在深度学习领域占据了半壁江⼭,最主要的原因是⽣态完善,⽽且api直观易⽤。但谁能想到现在MATLAB⽤起来⽐Pytorch…

word-毕业论文的每一章节的页眉单独设置为该章的题目怎么设置

在Microsoft Word中,为毕业论文的每个章节设置不同的页眉,通常需要使用“分节符”来分隔各个章节,然后在每个章节中单独设置页眉。以下是详细步骤: 使用分节符 插入分节符: 将光标放在每个章节的末尾(注意…

【简历】25届江苏二本JAVA简历:本末倒置,重点部分格式错误,不重要的写了一堆

简历总体说明 校招的第一法则就是必须要确定校招层次。 开发岗分为大中小厂,不同的层次对学校背景、时间点、项目和考点的要求都不太一样,所以必须要确定就业的层次。 这是一个25届二本同学的JAVA简历。 最近不知道怎么回事,看两份简历都…

字母异位词分组(java)

题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单shilie 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "n…

fpga spi回环

SPI设备间的数据传输之所以又被称为数据交换,是因为 SPI协议规定一个 SPI设备 不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)“或者"接收者 (Receiver)”.在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主 设备好还是从设备),相当于…

计算机网络-理论部分(二):应用层

网络应用体系结构 Client-Server客户-服务器体系结构:如Web,FTP,Telnet等Peer-Peer:点对点P2P结构,如BitTorrent 应用层协议定义了: 交换的报文类型,请求or响应报文类型的语法字段的含义如何…

路由器基本原理与配置

一 , 路由是什么? 从源主机到目标主机的转发过程; 二 , 路由器 (1)路由器的工作原理 路由器是一种三层设备,是使用IP地址寻址,实现从源IP到达目标IP地址的端到端的服务&#xff0c…

windows的WSL Ubuntu子系统重置root或其他用户的密码

思路:以管理员身份运行PowerShell,在命令行窗口重置密码 ,不需要删除或重新安装Linux子系统。 1、以管理员身份运行PowerShell 2、用root用户启动Ubuntu,执行 wsl.exe --user root 3、重置密码,执行passwd username&…

autoDL微调训练qwen2vl大模型

autodl是一家GPU服务厂商,提供专业的GPU租用服务,秒级计费、稳定好用 先去autodl把官方的帮助文档看懂先 AutoDL帮助文档 autodl注册并登陆,充钱,根据自己的情况租用新实例 创建新实例后马上关机,因为有个省钱的办法…

9.2 使用haarcascade_frontalface_default.xml分类器检测视频中的人脸,并框出人脸位置。

1)程序代码: # 2.使用haarcascade_frontalface_default.xml分类器检测视频中的人脸,并框出人脸位置 import cv2# 加载人脸检测的 Haar 级联分类器 face_cascade cv2.CascadeClassifier(./data/haarcascades/haarcascade_frontalface_defaul…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI,这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

前端小练习——星辰宇宙(JS没有上限!!!)

前言:在刚开始学习前端的时候,我们会学习到前端三件套中的JavaScript,可能那时候读者没有觉得JavaScript这个语言有多么的牛逼,本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做…

图文教程 | 2024年IDEA安装使用教程,JDK简易下载方法

前言 📢博客主页:程序源⠀-CSDN博客 📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正! 目录 一、IDEA安装 二、激活 三、JDK安装 四、JDK环境配置 五、验证 一、IDEA安装 进入官网下载: Other…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类(Tokenizer Class)应用分词器测试文本的编码与解码通过分词器…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号,不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多,但是每次更新都需要重新创建docker,也不太方便&…

网页作业9

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>服务中心</title><style>* {margin:…