文档章节

GCC编译过程记

珲少
 珲少
发布于 10/16 17:10
字数 1018
阅读 15
收藏 0

GCC编译过程记

一、引言

      对于编程工作者来说,GCC是一个熟悉的名字,它的全称是“GNU Compiler Collection”。GCC是一组编译器集合,目前其支持C、C++、Objective-C、Objective-C++、Go和RBIG语言的编译。本篇博客主要总结使用GCC进行代码编译的方法以及从源文件生成可执行文件的整个过程。

    GCC完整的编译过程分为4个阶段,分别为预处理、编译、装载和链接。经过完整的4部处理后,GCC会将源文件编译成可执行文件进行输出,但是很多时候,我们进行调用时并不需要每一个过程都单独调用,可以使用组合命令来让GCC帮我们处理完成这些工作。

二、GCC编译的输出参数

    由于GCC是一组编译器集合,因此输入的文件后缀名决定了GCC的编译方式,下面列出了常见的文件后缀名对应的编译方式:

文件后缀名  编译方式
.c C语言源代码,并且需要进行预处理
.i 已经预处理完成后的C语言源代码
.ii 已经预处理完成后的C++源代码
.m Objective-C源代码,并且必须进行libobjc库的链接
.mi 已经预处理完成后的Objective-C源代码
.M或.mm Objective-C++源代码,并且必须进行libobjc库的链接
.mii 已经预处理完成后的Objective-C++源代码
.h C,C++,Objective-C的头文件,会被处理进预编译头
.cc , .cp , .cxx , .cpp , .CPP , .c++ , .C C++语言源文件,需要进行预编译处理
.f , .for , .ftn 已经预处理完成后的Fortran语言源文件
.F , .FOR , .fpp , .FPP , .FTN Fortran语言源文件,需要进行预编译处理
.go Go语言源文件

下面以一个简单的C语言源文件来作为示例文件进行GCC的编译演示,首先编写一个简单的C程序如下,将文件名命名为a.c:

#include <stdio.h>
int main(int argc, char const *argv[])
{
	printf("%s\n","Hello");
	return 0;
}

·预编译处理

    使用 -E 参数设置GCC只进行预编译处理,例如对上面的a.c源文件执行如下的GCC命令:

gcc a.c -E > a.i

需要注意,GCC会将编译后的内容输出到a.i这个文件中,执行命令后,打开a.i文件,你会发现一个简单的C源文件被预处理成了500多行代码,你可以尝试在源文件中添加宏定义,预处理后所有的宏定义都被直接替换了。

    使用 -S 参数设置GCC进行编译功能,可以将预处理后的文件编译为汇编源代码,例如:

gcc a.i -S > a.S

.S为后缀名的文件为汇编源文件,-S编译是高级语言向低级语言转换的过程。

    使用 -c 参数设置GCC进行编译,可以将汇编后的汇编源文件编译成机器代码。例如:

gcc a.i -c > a.o

.o后缀名的文件一般我们就没有办法读懂了,其是机器码。-c编译是编程语言向机器语言转换的过程。

    除了上面提到的几个参数外,可以使用-o参数直接生成目标文件,这个参数会根据输入文件的后缀名进行处理,直接生成可执行文件,例如:

gcc a.o -o a.out

其实使用.c为后缀名的C语言源文件也可以直接使用-o参数生成可执行文件,此时GCC会聚合前面的预处理,编译,连接等过程。.out为后缀名的文件是可执行文件,在终端可以直接执行,如下:

 

© 著作权归作者所有

共有 人打赏支持
珲少

珲少

粉丝 851
博文 384
码字总数 452377
作品 0
上海
iOS工程师
私信 提问
有没有人在deepin10.12编译安装成功MYSQL?

CENTOS 5.5,MYSQL5.1.55编译安装成功,DEEPIN10.12编译安装MYSQL就不行,configure的时候出错,错误信息有两条,具体记不清楚了,一个是in /home/ocera/mysql5-1-55什么的,另个那个记不得了. 但是...

月影
2011/03/29
484
4
GCC 4.8.2 编译安装小记

以前从没有升级过GCC,一直用系统默认的GCC版本,最近在研究好久没有用过的 C, 便有了升级GCC的想发,大致如下。 环境: CentOS-6.5-i386 , gcc-4.4.7 系统必须已经安装有一个编译器,因为 ...

羊驼君
2013/12/15
0
2
PHP扩展开发小记

之前开发的Xukey,在PHP5.6和5.6之前的版本都没有任何问题,在兼容PHP7之后,执行生成随机数会出现“”段错误“”。编译扩展时加入debug,提示php terminated *** stack smashing dete。这样...

纵使有花兼明月何堪无酒亦无人
2016/06/14
36
0
嵌入式开发之C基础学习笔记02--第一个例子分析

1.C语言程序结构和书写规范 系统头文件 #include <stdio.h> 双引号:自定义库文件 尖括号:操作系统下规定的库文件 /this is a helloword program/ <---注释 #include <stdio.h> <---编译预处......

吴锦涛
2012/12/09
0
2
C语言编译全过程(有图有真相)

从上图可以看到: 预编译 将.c 文件转化成 .i文件 使用的gcc命令是:gcc –E 对应于预处理命令cpp 编译 将.c/.h文件转换成.s文件 使用的gcc命令是:gcc –S 对应于编译命令 cc –S 汇编 将....

Eysolitude
2016/01/08
115
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
12分钟前
0
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
45分钟前
1
0
Android SELinux avc dennied权限问题解决方法

1. 概述 SELinux是Google从android 5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。 然而,在开发中,我们经常会遇到由于SELinux造成的各种权限不足,即使拥有“...

TreasureWe
56分钟前
2
0
阿里云ACP认证详细笔记(一)

ECS--------------------------1.云服务器Elastic Compute Service(ECS)2.Terraform:您可以使用开源工具Terraform来预配和管理ECS资源。Terraform提供一种简单机制,能够将配置文件部署...

啃不动地大坚果
今天
1
0
如何实现MetaMask签名授权后DAPP一键登录功能?

1 摘要 网站太多,各种用户名/密码实在记不住。所以我们逐渐接受了BAT账号的授权登录功能。在以太坊DAPP应用中,也可以使用MetaMask实现授权后一键登录功能。MetaMask是去中心化钱包,授权信...

HiBlock
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部