目录
一、什么是gcc?
二、gcc编译程序的过程
三、gcc命令使用
1.预处理
2. 编译
3.汇编
4.链接
四、gcc常用选项
五、什么是gdb?
六、gdb功能
七、gdb用法
一、什么是gcc?
gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器,现在已经支持多种语言了,如C、Java、Pascal、Ada、COBOL语言等;
可以运行各种liunx 发行版,BSD,以及solaris等多种操作系统,并能够编译X86,X86-64等不同硬件平台上。还可以实现不同平台上的交叉编译,如在liunx平台上编译windows下的可用的软件
二、gcc编译程序的过程
预处理(
Pre-Processing
)
编译(
Compiling
)
汇编(
Assembling
)
链接(
Linking
)
gcc编译程序过程示意图:
三、gcc命令使用
1.预处理
C编译器对各种预处理命令进行处理
//预处理c文件
gcc -E hello.c -o hello.i
预处理过程:
- 将所有的#define删除,并且展开所有的宏定义
- 处理所有的条件预编译指令,比如#if 、#ifdef、#elif、#else、#endif等
- 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
- 删除所有注释“//”和“ /* */”
- 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
- 保留所有的#pragma编译器指令,因为编译器需要使用它们
2. 编译
将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件,后缀是.s
//编译成汇编文件
gcc -S hello.i -o hello.s
3.汇编
将汇编代码翻译成了机器码,后缀是.o文件
gcc -c hello.s -o hello.o
4.链接
把各种符号引用和符号定义转换成为可执行文件中的合适信息,后缀是 .out 文件或可执行文件
通常我们可以一步到位,直接编译链接成可执行文件
把所有.c文件编译链接成可执行文件main
四、gcc常用选项
选项名 |
作用 |
-o |
产生目标代码或可执行文件 |
-c |
通知gcc取消链接步骤,即编译源码并在最后生成目标文件 |
-E |
只运行C预编译器 |
-S |
告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s |
-Idir |
将dir目录加入搜索头文件的目录路径 |
-Ldir |
将dir目录加入搜索库的目录路径 |
-llib |
链接lib库 |
-g |
在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
-Wall |
使gcc对源文件的代码有问题的地方发出警告 |
五、什么是gdb?
gdb是GNU debugger的缩写,是编程调试工具
六、gdb功能
- 启动程序,可以按照用户自定义的要求随心所欲的运行程序。
-
可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。
- 当程序停住时,可以检查此时程序中所发生的事
- 动态地改变程序的执行环境
七、gdb用法
命令 |
含义 |
list(l) |
列出源代码 |
break(b) |
设置断点 |
info break |
查看断点信息 info functions |
run(r) |
运行 |
continue(c) |
继续程序运行,直到下一个断点 |
step(s) |
单步跟踪,类似于VC中的step into |
next(n) |
单步跟踪,类似于VC中的step over |
finish |
运行程序,直到当前函数返回 |
util(u) |
退出循环 |
print(p) |
查看运行时的变量以及表达式 |
watch |
设置观察点 |
示例:
注意:运用gdb的时候需要编译时加上之前图片中有提到的-g选项,在目标文件中嵌入调试信息,以便gdb之类的调试程序调试
l列出源代码,b设置断点,r运行,n单步跟踪
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!