您的位置  > 互联网

编译器所需要的可执行文件的错误类型及对策

-c,仅编译,不链接到可执行文件。 编译器仅根据输入的 .c 和其他源代码文件生成带有 .o 后缀的目标文件。 通常用于编译不包含主程序的子程序文件。

-o,确定输出文件的名称,该名称不能与源文件同名。 如果没有给出这个选项,gcc将给出默认的可执行文件a.out。 eg: gcc -o test test.c 然后执行生成的文件./test,即执行生成的可执行文件。

-g,为符号调试工具(GNU的gdb)生成必要的符号信息。 如果我们想调试源代码,就必须添加这个选项。

-O,优化程序的编译和连接。 使用此选项,整个源代码将在编译和连接过程中得到优化。 生成的可执行文件的执行效率可以提高,但编译和连接的速度会相应降低。 地面速度较慢。

-O2 比 -O 更好地优化编译和连接,但当然整个编译和连接过程会更慢。

-I,将指向的目录添加到程序头文件目录列表中,这是预编译过程中使用的参数。

-L,将指向的目录添加到程序函数归档文件的目录列表中,是连接过程中使用的参数。

2. GCC错误类型及对策

第一类:C 语法错误

错误消息:文件 .c 中的第 n 行存在语法错误 ( )。 这类错误一般是C语言中的语法错误。 您应该仔细检查源代码文件中的第n行以及该行之前的程序。 有时还需要检查文件中包含的头文件。 在某些情况下,gcc 对于一个非常简单的语法错误会给出很多错误。 这个时候你要保持清醒的头脑,不要被吓倒。 有需要的话可以参考C语言基础教材。

类别2:头文件错误

错误消息:找不到文件 head.h(找不到文件 head.h)。 此类错误是由源代码文件中包含的头文件有问题引起的。 可能的原因包括头文件名错误、指定头文件的目录名错误等,也可能是双引号和尖括号的使用不正确。

类别 3:存档错误

错误信息:链接器找不到所需的函数库,例如:ld: -lm: No such file 或。 此类错误意味着与目标文件连接的函数库存在错误。 可能的原因是函数库名称错误、指定函数库的目录名称不正确。 检查的方法是使用find命令在可能的目录中查找对应的函数库名称,确定归档文件和目录的名称,并在程序和编译选项中修改名称。

第四类:未定义的符号

错误信息:未定义的符号( )。此类错误发生在连接过程中。 可能有两个原因:一是用户定义的功能

数字或全局变量所在的源代码文件尚未编译、链接或根本未定义。 这就需要用户根据实际情况修改源程序,提供全局变量或函数的定义体; 第二,未定义的符号是源程序中使用了标准库函数,但是在连接过程中没有给出对应的函数库的名称,或者是存档的目录名称有问题。 这种情况下,就需要使用归档维护命令 ar 检查我们需要的库函数位于哪个函数库中。 确认后,修改gcc连接选项中的-l和-L项。

3.GCC编译过程

预处理>编译>汇编>链接。

第一步预处理

gcc -E 你好.c -o 你好.i

预编辑主要处理前面带“#”的指令,如#、#等,还需要删除注释、添加行号和文件名标识符。

第二步是编译

gcc -S 你好.i -o 你好.s

编译过程就是对预处理后的文件进行一系列词法分析、语法分析、语义分析和优化,产生相应的汇编代码文件。

第三步,编译

gcc -c 你好.s -o 你好.o

将代码转换为机器可以执行的指令。

第四步,连接

连接是一个复杂的过程,使用ld命令

ld - crt1.o crti.o .o hello.o -start -group -lgcc - -lc -end-group .o crtn.o

连接过程包括顺序叠加、相似段合并、符号地址确定、符号解析和重定位、指令修改、全局构造和解析等。