2.5、GCC与GDB编译过程及错误分析

在这里插入图片描述
gcc 组件
(1)分析器:分析语法结构,将C语言编译汇编语言。.s
(2)汇编器:将汇编代码编译成二进制文件
(3)链接器:链接目标文件以及库文件,生成可执行代码。
(4)标准C库:提供核心的C库函数。scanf printf

gcc编译过程
(1)预处理: 宏替换和头文件展开.c - > .i 。
gcc -E test.c -o test.i
(2)编译: 将经过预处理后的文件.i,编译成汇编文件.s
gcc -S test.i -o test.s
(3)汇编: 将汇编文件.s 编译成目标文件.o 二进制码
gcc -c test.s -o test.o
(4)链接: 将一个或多个目标文件,及库链接成为可执行二进制文件
gcc test.o -o a.out

gcc -g test.c 生成可执行文件,同时附加调试信息,以便于GDB工具使用

gcc -O 编译时需要使用编译优化。
-O1 O2

gcc -I头文件路径 指定头文件的搜索路径

gcc -l第三方库名 指定链接的其他库

第一类∶C语法错误
错误信息∶文件source.c中第n行有语法错误(syntex errror)。有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,我们最主要的是要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。

第二类∶头文件错误
错误信息∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

第三类∶档案库错误
错误信息∶链接程序找不到所需的函数库(ld: -lm: No such file or directory )。这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。

第四类∶未定义符号
错误信息∶有未定义的符号(Undefined symbol)。这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc连接选项中的-l和-L项。

GDB :调试工具

  1. 调试的程序,编译时必须加 -g 选项 gcc -g 1. c -o 1
  2. 进入调试: gdb ./文件名 gdb ./1

GDB调试模式

  1. 退出 q
  2. l —参看源码十行
  3. b 行号 —设置断点
  4. info b —查看设置的断点
  5. del 断点编号 —删除设置的断点
  6. r —全速运行
  7. n —单步执行
  8. p 变量名 —查看变量值
  9. c —恢复运行,全速运行到下一断点或结束
  10. backtrace —栈回溯命令,用于定位段错误
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41110647/article/details/106316420