[C]GCC编译

介绍

GCCGNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布。

GCC支持多种语言,C/C++、Fortran、Ada等。

GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。Windows下的GCC平台为MinGW Developer Studio。但以下过程均为Linux上的描述。

GCC编译过程

首先,需要了解GCC编译程序的过程一般分为四个主要的阶段。

GCC编译程序的四个阶段

GCC编译程序的过程可以分成四个阶段:预处理、编译、汇编、链接。前三个阶段应用于单独的源文件,生成该文件对应的.o文件;而最后的链接阶段则将所有的目标文件结合生成一个可执行文件。

这四个阶段对应的操作如下所示:

#预处理,生成.i文件
gcc -E test.c -o test.i
#编译,生成.s文件
gcc -S test.i -o test.s
#汇编,生成.o文件
gcc -c test.s -o test.o
#链接,生成可执行文件
gcc test.o -o test

在Linux系统上,文件名后缀不起关键作用,但是对于GCC编译器则不同,GCC编译器会根据文件后缀名来认知文件的类型!-[ESco]作为编译器的全局开关,控制着最终输出的文件的类型,可以看做“编译路径”的终点,而GCC处理对象文件的后缀则决定着“编译路径”的起点,可见下图:


在将汇编文件的后缀.s改为.i后,我再想用GCC编译器处理它,用-S开关控制输出的类型为中间目标文件.o,就会出错,因为GCC会再次对.i文件进行编译,这个.i文件原本就是.s文件改名而来,是经过了编译阶段的,再编译一次,当然会出错!

所以,文件的后缀名对于GCC而言是及其重要的,下面来了解下。

GCC涉及的文件后缀名(suffix)

整理了一下,暂且这些:

.a为后缀的文件,是由目标文件构成的档案库文件; 
.C,.cc或.cxx 为后缀的文件,是C++源代码文件; 
.h为后缀的文件,是程序所包含的头文件; 
.i 为后缀的文件,是已经预处理过的C源代码文件; 
.ii为后缀的文件,是已经预处理过的C++源代码文件; 
.m为后缀的文件,是Objective-C源代码文件; 
.o为后缀的文件,是编译后的目标文件; 
.s为后缀的文件,是汇编语言源代码文件; 
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
.c为后缀的文件,C语言源代码文件; 

基本用法

gcc [options] [filename]

options既包括如上节所说的全局选项[ESco],也包括局部选项,见下:

-g:保留调试信息

-O:优化编译、链接过程,使产生的可执行文件执行效率高;但会降低编译和链接的速度

-O2:较-O更进一步,编译出的文件执行效率更高,但编译和链接的速度较-O时更慢

-Wall:打开编译告警



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值