GCC编译过程以及对应FILE文件表

gcc/g++在执行编译工作的时候,总共需要4步

(1).预处理:生成.i的文件[预处理器cpp]
(2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
(3).汇编:有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
(4).连接: 链接目标代码,生成可执行程序[链接器ld]
在这里插入图片描述
绝大多数编译器并不是一个单一的庞大程序。它们通常由多达六七个稍小的程序所组成,这些程序由一个叫做“编译器驱动器( compiler driver)的控制程序来调用。这些可以方便地从编译器中分离出来的单独程序包括:预处理器( preprocessor)、语法和语义检查器( syntactic and semantic checker)、代码生成器( code generator)、汇编程序( assembler)、优化器( optimizer)、链接器( linker),当然还包括一个调用所有这些程序并向各个程序传递正确选项的驱动器程序( driver program)(见图5-1)。优化器几乎可以加在上述所有阶段的后面。当前的 SPARC编译器在编译器的前端和后端之间的中间表示层执行绝大部分的优化措施

总体选项(Overall Option)
-x language

明确指出后面输入文件的语言为 language (而不是从文件名后缀得到的默认选择). 这个选项应用于后面
所有的输入文件,直到遇着下一个-x选项. language 的可选值 有 c, objective-c, c-header,
c++, cpp-output, assembler,和assembler-with-cpp.

-x none

关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过-x选项).

如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用-x选项(或文件名后缀)告诉 gcc 从哪里开始,用-c, -S,或-E选项告诉 gcc 到 哪里结束.
注意,某些选项组合(例如, -x cpp-output -E)使 gcc 不作任何事情.

-c

编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.缺省情况下, GCC 通过用.o替换源文件名后缀.c, .i, .s,等等,产生目标文件名.可以使用-o 选项选择其他名字.GCC 忽略-c 选项后面任何无法识别的输入文件(他们不需要编译或汇编).

-S

编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.

缺省情况下, GCC 通过用.o替换源文件名后缀.c, .i,等等,产生 目标文件名.可以使用-o 选项选择其他名字.

GCC 忽略任何不需要编译的输入文件.

-E

预处理后即停止,不进行编译.预处理后的代码送往标准输出.

GCC 忽略任何不需要预处理的输入文件.

-o file

指定输出文件为 file.该选项不在乎 GCC 产生什么输出,无论是可执行文件,目标文件,汇编文件,还是预处理后的 C 代码.

由于只能指定一个输出文件,因此编译多个输入文件时,使用-o选项没有意义,除非输出一个可执行文件.
如果没有使用-o选项,默认的输出结果是:可执行文件为a.out, source.suffix的目标文件是source.o,汇编文件是 source.s,而预处理后的 C 源代码送往标准输出.

-v

(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.

-pipe

在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU 的汇编器没有这个问题.

GCC文件表
文件(FILE)格式含义
file.cC 源文件
file.hC 头文件(预处理文件)
file.i预处理后的 C 源文件
file.CC++源文件
file.ccC++源文件
file.cxxC++源文件
file.mObjective-C 源文件
file.s汇编语言文件
file.o目标文件
a.out连接的输出文件
TMPDIR/cc*临时文件
LIBDIR/cpp预处理器
LIBDIR/cc1C 编译器
LIBDIR/cc1plusC++编译器
LIBDIR/collect某些机器需要的连接器前端(front end)程序
LIBDIR/libgcc.aGCC 子例程(subroutine)库
/lib/crt[01n].o启动例程(start-up)
LIBDIR/ccrt0C++的附加启动例程
/lib/libc.a标准 C 库,另见 intro (3)
/usr/include#include文件的标准目录
LIBDIR/include#include 文件的标准 gcc 目录
LIBDIR/g++-include#include 文件的附加 g++目录
LIBDIR通常为/usr/local/lib/machine/version.
TMPDIR来自环境变量 TMPDIR (如果存在,缺省为/usr/tmp ,否则为 /tmp).

参考资料:

  1. 《程序员的自我修养》
  2. 程序员的自我修养——编译和链接 CSDN
  3. GCC中文手册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值