Linux,GCC解析及编译过程

  1. 什么是GCC

GCC编译器是LInux系统下最常用的C/C++编译器,大部分Linux发行版中都会默认安装,GCC编译器通常以gcc命令的形式在终端(Shell)中使用

  • GCC 原名为 GNU C语言编译器(GNU C Compiler)

  • GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言

译器。GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前

端,也包括了这些语言的库(如 libstdc++,libgcj等)

  • GCC 不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行

选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如,当使用命令行参数

`-std=c99` 启动 GCC 时,编译器支持 C99 标准。

  • 安装命令 sudo apt install gcc g++ (版本 > 4.8.5)

  • 查看版本 gcc/g++ -v/--version

编程语言的发展:

GCC编译步骤

从hello.c到hello(或a.out)文件,必须经过 hello.i, hello.s , hello.o , 最后才得到目标文件,分别对应着预处理,编译,汇编,和链接四个步骤,整个过程如图所示·:

813b1114ce360b0f4a33578160e385bb.png

  • 预处理:C编译器对各种预处理命令进行处理,包括头文件包含,宏定义的扩展,条件编译的选择等;

  • 编译:将预处理得到的源代码文件进行语法语义分析,“翻译转换”产生出机器语言的目标程序,得到机器语言的汇编文件;

  • 汇编:将汇编代码翻译成机器码,但是还是不能运行;

  • 链接:处理可重定位的文件,把各种符号引用和符号定义转换为可执行文件中的合适信息,通常是虚拟地址。

根据test.c这个示例,跟踪每一个细节

test.c:

  1. 预处理

在gcc命令后加上-E参数,可以得到预处理文件

gcc -E test.c -o test.i
或者gcc test.c -E -o test.i

产生的test.i文件,就是test.c经过预处理后的文件,原本几行的代码,经过预处理,得到一个几千行的预处理文件,文件按打开内容如下。79f0cfcd554fc118281c334d5ea669ac.png最后编译后的文件,前面几百行代码都是头文件的打开,注释也被预处理了

  1. 编译

在gcc编译参数加上-S,可以将test.i编译成test.s文件,命令如下:

gcc -S test.i
或者gcc test.i -S -o test.s

test.s是一个汇编文件,汇编语句我不懂,打开后是这样

  1. 汇编

得到汇编文件后,通过gcc就可以得到机器码了,在终端输入下面命令,可以得到test.o文件

gcc -c test.s
//gcc test.s -C -o test.o

这里的test.o还不能运行,我们可以直接用下面代码实现汇编跟链接

  1. 链接

尽管已经得到了机器码,但是这个文件还不能运行,必须经过链接才能运行,在终端输入下面命令,可以得到可执行文件a.out

gcc test.o

链接得到a.out文件,这个文件是gcc默认输出文件名称,可以通过-o参数致电给新的文件名。比如加上“-o test”就会生成test文件,这个文件其实跟a.out一样的。

GCC常用参数选项

744ea651d04fd828d9851fed6bbf7a04.png 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值