❀Linux系统上C语言的编译与调试你还不知道吗?❀

本文详细介绍了C语言的编译过程,包括预处理、编译、汇编和链接四个步骤,并通过gcc命令行工具进行了演示。同时,讨论了在多文件项目中如何使用makefile简化编译,并提到了Debug和Release版本的区别。此外,还讲解了使用gdb进行程序调试的基本操作,如设置断点、查看变量值和控制程序执行等。
摘要由CSDN通过智能技术生成

1. gcc的安装

2. 分步编译连接

C语言的编译过程:
在这里插入图片描述一个C语言程序,需要经过预处理、编译、汇编、链接,才能得到可执行程序

gcc提供分布编译链接,分别为:

  1. 预处理:
gcc -E main.c -o main.i
  1. 编译:
gcc -S main.i -o main.s
  1. 汇编:
gcc -c main.s -o main.o
  1. 链接:
gcc main.o -o main
  • 也可以单步执行直接预处理编译汇编链接成功,执行下面这条语句:
gcc -o main main.c
gcc main.c

最后生成的main为可执行程序,如果没有错误的情况下,直接运行此文件即可
下面对这一过程进行演示:

  • 写了一个main.c
    在这里插入图片描述

  • 预处理
    在这里插入图片描述

  • 编译、汇编、链接
    在这里插入图片描述

  • 运行main程序
    在这里插入图片描述

  • 一步预处理编译汇编链接
    在这里插入图片描述

3. 编译链接过程

在这里插入图片描述

3.1 预编译阶段

  1. 删除所有的“#define”,并且展开所有的宏定义,即将宏定义展开,换掉程序中宏的值;
  2. 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
  3. 处理“#include”预编译指令,将被包含的库文件插入到文件中;
  4. 删除所有的程序注释;
  5. 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
  6. 保留所有的#pragma 编译器指令,因为编译器需要使用它们。
    在这里插入图片描述

3.2 编译阶段

词法分析、语法分析、语义分析,代码优化,汇总符号。
在这里插入图片描述

3.3 汇编阶段

将汇编指令翻译成二进制格式,生成各个 section,生成符号表

在这里插入图片描述

3.4 链接过程

  1. 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址
  2. 符号重定位
    在这里插入图片描述
    上面这种编译过程,在单个文件的时候不会特别麻烦,但是如果有多个C语言文件需要编译的时候,就显得十分麻烦,我们发现在windows系统中,执行C语言程序,我们看不到各个单个的过程,只需要点击一下执行按钮即可执行,其实windows的一些编译器,自动为我们写好了一键执行文件,当我们点击执行按钮的时候,调用这个执行文件,自动执行编译等过程,在Linux中,其实我们也可以进行这种操作,我们可以按照下面这个过程创建一个文件,通过在文件中加入一些语句,来实现对于多个文件的编译等过程。

4. makefile和make

管理工程、实现自动化编译,如下:

  • 写一个add.h
    在这里插入图片描述

  • 写一个add.c
    在这里插入图片描述

  • 写一个max.h
    在这里插入图片描述

  • 写一个max.c
    在这里插入图片描述

  • 写一个main.c
    在这里插入图片描述

  • 按照传统的编译
    在这里插入图片描述
    在这里插入图片描述

  • 使用makefile来实现
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里面如果make没有安装,则会提示按照什么命令进行安装,照着提示命令安装就行了

5. gdb调试

5.1 Debug和Release

  • Debug
    Debug版本往往被称作可调式版本,生成的可执行文件中包含调试需要的信息,作为开发人员,最常用的就是debug版本的可执行文件
    因为调试信息是在编译的时候加入到中间文件.o中的,所以必须在编译时候控制其生成包含调试信息的中间文件
    执行下面这条语句,即可获取中间文件:
gcc -o hello hello.c -g
  • Release
    发行版本,提供给用户使用的版本,通过gcc默认生成的就是Release版本

对于C语言的调试过程,首先通过将源代码编译、连接生成Debug版本的可执行文件,然后通过

gdb Debug版本的可执行文件名

进入调试模式

5.2 单进程、单线程基础调试命令

  • 首先写一个test.c文件,我们来执行一些常见的gdb调试信息,代码如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    从上面我们可以看出一些常用的指令,比如:
b 行号 //给行号加断点
b 函数名 //给函数的第一行的地方加一个断点
info break //显示断点的信息
l //显示源代码 按一下生成一段代码,会接着上面现实的继续显示
r //运行程序
n //单步执行程序
s //进入即将被调用的函数中执行
finish //跳出函数
q //退出调试
p val //打印变量的值,注意这里面的val可以是地址,也可以是表达式,也可以是数组的所有元素
c //继续执行
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值