Linux 系统上 C 程序的编译与调试

发布于:2022-11-03 ⋅ 阅读:(555) ⋅ 点赞:(0)

C程序的编译(gcc)

程序的编译链接过程详解

要想清楚程序的编译链接过程,前提是什么、是可执行文件吗?

文件是一个外存的概念,文件只存在于”外存”(硬盘,U盘,网盘)中,文件由两部分构成,文件名和文件主体。文件的分类: 可执行文件,不可执行文件

可执行文件:在Windows操作系统中,扩展名为:*.exe,*bat 等的文件是可执行文件,可执行文件由指令和数据构成。Linux是靠文件属性来判断是否可执(Linux 不以后缀名区分文件类型)。不可执行文件:其内容是由数据构成。

示例:C/C++语言中:* .c / * .cpp源文件(文本),* .h头文件(文本) * .o / * .obj 二进制目标文件,* .exe可执行文件。

在这里插入图片描述
如图所示:

1. 预编译阶段(预处理阶段)
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改(这里所说的替换并不是指原来的文件被删除)

a) 删除所有的“#define”,并且展开所有的宏定义;
b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
d) 删除所有的注释;
e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
f) 保留所有的#pragma编译器指令,因为编译器需要使用它们。

2. 编译阶段:
.i文件中的代码翻译成特定汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件

词法分析、语法分析、语义分析,代码优化,汇总符号。

3. 汇编阶段:
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件**.o文件**,是二进制格式

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

4. 链接阶段:
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件

a) 合并各个 section,调整 section 的起始位移和段大小,合并符号 表,进行符号解析,给符号分配虚拟地址;
b) 符号重定位

gcc 分步编译链接命令

安装 gcc 命令 : sudo apt install gcc

1. 预编译 :

gcc -E main.c -o main.i

2. 编译:

gcc -S main.i -o main.s

3. 汇编:

gcc -c main.s -o main.o

4. 链接:

gcc main.o -o main
在这里插入图片描述

gcc 一步编译命令

gcc -o main main.c
在这里插入图片描述
图中情况 main (可执行程序)所依赖的源文件只有 main.c 一个,若有多个,直接把文件名 * .c 写在main.c 后即可

make 命令以及 makefile 文件编写—管理工程实现自动化编译

安装 make 命令: sudo apt install make

1. 源文件准备 (add.c mul.c main.c 准备工作)

在这里插入图片描述

2. makefile 文件编写(文件名必须是 makefile)

对main.c add.c mul.c 三个文件进行编译(注意前面必须是table键缩进)
在这里插入图片描述

3.make 默认调用 makefile 文件,并且只针对 makefile 文件有效

在这里插入图片描述

make clean 命令(调用 makefile 文件中的 clean)

在这里插入图片描述

C程序的调试(gdb)

Debug 版本和 Release版本

Debug版本:

Debug版本为可调试版本,生成的可执行文件中包含调试需要的信息,我们作为开发人员,最常用的就是debug版本的可执行文件
Debug 版本的生成: 因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件
gcc -c hello.c -g ( 生成包含调试信息的中间文件) gcc -o hello hello.o
或者
gcc -o hello hello.c -g(常用)

Release 版本:

Release版本为发行版本,是提供给用户使用的版本用 gcc 默认生成的就是 Release 版本。
首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过‘gdb Debug 版本的可执行文件名’ 进入调试模式。

gdb调试命令

安装gdb命令: sudo apt install gdb
在这里插入图片描述
简单示例:
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到