GCC(GNU Compiler Collection)是一套由GNU计划开发的自由软件编译器集合,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。GCC 是一个功能强大、稳定可靠的编译器,被广泛应用于各种操作系统和平台上。
gcc编译器具有以下特点:
gcc的使用格式
gcc [options] [filenames]
gcc的编译过程:
C语言的编译分为四个阶段:预处理、编译、汇编、链接。
预处理器会对源代码进行预处理,将包含在头文件中的内容插入到程序中,根据宏定义展开宏,删除注释等。这一阶段生成的文件称为预处理文件,后缀为“.i”。
编译器会将预处理阶段得到的文件进行编译,生成汇编代码。编译的主要任务是将高级语言翻译成汇编语言,如变量、函数、语句等。这一阶段生成的文件称为汇编文件,后缀为“.s”。
汇编器将汇编代码转换成机器码,并生成目标文件。每条汇编指令都被转换为一个或多个机器码指令,也就是二进制表示的指令序列。这一阶段生成的文件称为目标文件,后缀为“.o”。
链接器将不同的目标文件整合成一个可执行文件。在这个阶段,链接器还会检查目标文件中引用的函数和变量是否已经定义,如果没有,就会报错。这一阶段生成的文件就是我们可以执行的可执行文件,没有后缀名。
预处理器会对源代码进行预处理,将包含在头文件中的内容插入到程序中,根据宏定义展开宏,删除注释等。这一阶段生成的文件称为预处理文件,后缀为“.i”。
选项 | 说明 |
---|---|
-E | 只对文件进行预处理,不进行编译,生成的结果送标准输出 |
-o file | 将输出写到指定的文件file中 |
-I dir | 指定头文件的路径dir,先在指定路径中搜索要包含的头文件,若找不到,则在标准路径中搜索 |
-D name | 定义一个宏name,并可以指定值 |
gcc -E lab.c -o lab.i # 将lab.c文件预处理并输出到lab.i文件内
编译器会将预处理阶段得到的文件进行编译,生成汇编代码。编译的主要任务是将高级语言翻译成汇编语言,如变量、函数、语句等。这一阶段生成的文件称为汇编文件,后缀为“.s”。
编译成汇编代码:
选项 | 说明 |
---|---|
-S | 只进行编译,不进行汇编,生成汇编代码文件.s |
gcc -S lab.c # 生成lab.s文件
gcc -S lab.i -o lab2.s # 生成lab2.s文件
编译成目标代码
选项 | 说明 |
---|---|
-c | 把源文件编译成目标代码( .o ),不进行链接 |
gcc -c lab.c # 产生lab.o文件
gcc -o out_file file.c # 将文件file.c编译成可执行文件file1;如果未使用该选项,则可执行文件放在a.out中
gcc -o ab a.c b.c
gcc -o ab a.o b.o # 这样更优
当代码和文件很多时,由于每个文件编译都需要时间,且可能每次编译时只是极个别文件发生了改变,此时用第二种方法较优。
选项 | 说明 |
---|---|
-g | 在目标代码中加入供调试程序gdb使用的附加信息 |
-v | 显示gcc版本 |
-Wall | 显示警告信息 |
选项 | 说明 |
---|---|
-O0 | 缺省情况,不优化 |
-O1 | 一级优化 |
-O2 | 进行比O1高一级的优化 |
-O3 | 产生更高级别的优化 |
选项 | 说明 |
---|---|
-Ldir | 将dir所指出的目录加到“函数库搜索列表”中 |
-iname | 连接时,加载名字为name的函数库(实际的库名是libname) |
标准库文件一般存储在
/lib
和/usr/lib
目录中所有的库名都以
lib
开头
…
GDB(GNU Debugger)是一款功能强大的开源调试工具,用于调试C、C++、Ada、Objective-C、Fortran等多种编程语言的程序。它可以帮助开发者追踪程序运行时的错误和异常,以及对程序进行调试、分析和优化。
ubuntu上安装gdb
sudo apt update
sudo apt install gdb
使用gdb调试的前提:在程序编译过程中,使用-g
选项生成可执行文件。
gcc -g -o lab lab.c
启动gdb
gdb lab
gdb调试的是可执行文件,不是源文件
list
命令:列出调试程序的源文件。
格式 | 说明 |
---|---|
list | 没有参数,显示当前行开始10行 |
list + | 显示当前行之后的10行 |
list - | 显示当前行之前的10行 |
list n | 显示n行附近的10行 |
list start,end | 显示从start到end行的代码 |
show listsize
:查看显示的行数set listsize
:设置显示的行数break
命令:设置断点
info breakpoints
:查看断点
delete
:删除断点
run
:运行程序,执行到断点/程序结束
next
:单步执行,不进入函数内部
step
:单步执行,进入函数内部
continue
:程序从当前位置开始,执行到断点/程序结束
kill
:终止正在调试的程序
print
:显示变量/表达式的值
set
:修改变量的值
display
:预先设置一些要显示的表达式
info display
:显示当前设置的表达式的清单
delete display
:取消对设置的表达式的自动显示功能
格式 | 说明 |
---|---|
backtrace(bt) / where | 显示函数调用的层次关系 |
up [n] | 向上移动n层栈帧 |
down [n] | 向下移动n层栈帧 |