gcc
gcc简介
GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。可处理C、C++、Fortran、Pascal、Objective-C、Java、Ada,Go等其他语言。——Wiki
gcc编译流程
GCC 编译器在编译一个C语言程序时需要经过以下 4 步:
- (-E)将C语言源程序预处理,生成.i文件。
- (-S)预处理后的.i文件编译成为汇编语言,生成.s文件。
- (-c)将汇编语言文件经过汇编,生成目标文件.o文件。
- 将各个模块的.o文件链接起来生成一个可执行程序文件。
注:
.i
文件、.s
文件、.o
文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件。中间文件被删除。- 每一个步骤生产的文件都可以直接从.c 文件执行对应得命令后直接生成,不必按顺序。(到底还是按顺序,只是系统把它们删了)
gcc编译选项 | 选项的意义 |
---|---|
-c | 编译、汇编指定的源文件,但是不进行链接 |
-S | 编译指定的源文件,但是不进行汇编 |
-E | 预处理指定的源文件,不进行编译 |
-o [file1] [file2] | 将文件 file2 编译成可执行文件 file1 |
-I directory | 指定 include 包含文件的搜索目录 |
-g | 生成调试信息,该程序可以被调试器调试 |
直接编译:gcc hello.c -o hello
,生成hello可执行文件可直接运行。
gdb
gdb简介
GNU调试器(英语:GNU Debugger,缩写:GDB),是GNU软件系统中的标准调试器,此外GDB也是个具有移携性的调试器,经过移携需求的调修与重新编译,如今许多的类UNIX操作系统上都可以使用GDB,而现有GDB所能支持调试的编程语言有C、C++、Pascal以及FORTRAN。——Wiki
在用gcc编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试
单步执行和跟踪
1 | $ gcc -g main.c -o main |
-g选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
gdb提供了一个很方便的功能,在提示符下直接敲回车表示重复上一条命令。