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

【gcc编译以及Makefile与GDB调试】

From ChatGPT

Prompt:教我gcc编译以及Makefile与GDB调试

好的!我来一步步教你如何使用 GCC 编译、Makefile 进行管理,以及 GDB 调试 C/C++ 程序


1. 使用 GCC 编译 C/C++ 代码

1.1 编译 C 代码

假设有一个 C 语言程序 main.c

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

编译命令:

gcc main.c -o main

运行:

./main

1.2 编译 C++ 代码

如果是 C++ 代码 main.cpp

#include <iostream>

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

编译:

g++ main.cpp -o main

运行:

./main

1.3 启用调试信息

如果你需要用 GDB 调试,编译时加 -g

g++ -g main.cpp -o main

2. 使用 Makefile 进行编译管理

如果你的项目有多个源文件,每次编译手动输入 g++ 会很麻烦,所以可以使用 Makefile 自动化编译。

2.1 例子

假设你的项目结构如下:

project/
│── src/
│   ├── main.cpp
│   ├── add.cpp
│   ├── add.h
│── Makefile

文件 add.h:

#ifndef ADD_H
#define ADD_H

int add(int a, int b);

#endif

文件 add.cpp:

#include "add.h"

int add(int a, int b) {
    return a + b;
}

文件 main.cpp:

#include <iostream>
#include "add.h"

int main() {
    std::cout << "3 + 4 = " << add(3, 4) << std::endl;
    return 0;
}

2.2 Makefile

CXX = g++
CXXFLAGS = -Wall -g
TARGET = main
SRCS = src/main.cpp src/add.cpp
OBJS = $(SRCS:.cpp=.o)

$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)

src/%.o: src/%.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

clean:
	rm -f $(OBJS) $(TARGET)

2.3 使用 Make

在project目录下与运行

  • 编译:
    make
    
  • 运行:
    ./main
    
  • 清理:
    make clean
    

3. 使用 GDB 进行调试

如果你的程序有 bug,需要用 GDB(GNU Debugger) 进行调试。

3.1 先编译带调试信息的程序

g++ -g main.cpp add.cpp -o main

3.2 启动 GDB

gdb ./main

3.3 常用调试命令

命令作用
run (r)运行程序
break main (b main)main 函数设置断点
break 10 (b 10)在第 10 行代码设置断点
next (n)单步执行(不进入函数内部)
step (s)单步执行(进入函数内部)
continue (c)继续运行
print x (p x)查看变量 x 的值
info locals查看当前作用域的所有变量
quit (q)退出 GDB

3.4 调试示例

启动 GDB:

gdb ./main

main.cpp 第 5 行设断点:

b main.cpp:5

运行程序:

r

单步执行:

n

查看变量值:

p a
p b

退出:

q

总结

  • GCC/G++ 直接编译 C/C++ 程序
  • Makefile 自动化管理编译流程
  • GDB 进行调试,排查 bug

这样,你就可以用 GCC + Makefile + GDB 高效地开发 C/C++ 程序了!有问题可以随时问我 😃

相关文章:

  • python LLM工具包
  • JavaScript数据类型和内存空间
  • 20-智慧社区物业管理平台
  • Java【多线程】(3)单例模式与线程安全
  • 大模型如何从开始到编译出Engine
  • [免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】
  • 一个简化版的进程内通信库实现
  • 深入理解Java中的static关键字及其内存原理
  • 《云原生技术:DeepSeek分布式推理的效能倍增器》
  • Git系列之git checkout
  • 发起请求的步骤
  • Spring Boot整合WebSocket
  • 基于深度学习的中文文本情感分析系统
  • EasyTwin全新体验 | 春启新章,智焕新生
  • 隧道定向号角喇叭为隧道安全保驾护航
  • Microsof Visual Studio Code 安装教程(中文设置)
  • 计算机网络基础知识(web漏洞解析与攻防实战)
  • stm32week6
  • linux docker相关指令
  • Centos磁盘扩容
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……
  • 体坛联播|巴萨提前2轮西甲夺冠,郑钦文不敌高芙止步4强
  • 龚正会见哥伦比亚总统佩特罗
  • 上海黄浦江挡潮闸工程建设指挥部成立,组成人员名单公布