目录
一、什么是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 文件或可执行文件
gcc hello.o -o hello
通常我们可以一步到位,直接编译链接成可执行文件
gcc hello.c -o hello
把所有.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单步跟踪
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!