文档章节

GCC编译过程记

珲少
 珲少
发布于 2018/10/16 17:10
字数 1018
阅读 31
收藏 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为后缀名的文件是可执行文件,在终端可以直接执行,如下:

 

© 著作权归作者所有

共有 人打赏支持
珲少

珲少

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

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

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

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

羊驼君
2013/12/15
0
2
嵌入式开发之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
Linux编译安装GCC-5.1.0

Linux编译安装GCC-5.1.0 Linux下编写C/C++程序自然缺不了一个优秀的编译器,Linux下比较常见的自然是GCC了。2015年4月下旬GCC也出到了5.1.0版本,对于C++11/14也有了更好的支持了。因为最近在...

LUIS1983
2015/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB

关于MongoDb 1、MongoDB是一个开源的、基于分布式的、面向文档存储的非关系型数据库。 2、是非关系型数据库当中功能最丰富、最像关系数据库的。 3、由C++编写, MongoDB可以运行在Windows、u...

谢思华
34分钟前
3
0
Node.js 进程平滑离场剖析

本文由云+社区发表 作者:草小灰 使用 Node.js 搭建 HTTP Server 已是司空见惯的事。在生产环境中,Node 进程平滑重启直接关系到服务的可靠性,它的重要性不容我们忽视。既然是平滑重启,就涉...

腾讯云加社区
42分钟前
3
0
druid等 olap框架对比分析

简介 Druid 是一个开源的,分布式的,列存储的,适用于实时数据分析的存储系统,能够快速聚合、灵活过滤、毫秒级查询、和低延迟数据导入。 Druid在设计时充分考虑到了高可用性,各种节点挂掉...

hblt-j
42分钟前
3
0
Idea 禁用代码重复等警告

在相应方法上添加注解 @SuppressWarnings("action") @Transactional@SuppressWarnings("Duplicates")public void analyzeDpBook(DpBook dpBook) { EpubBook _epubBook = epubBookSe......

lemos
45分钟前
1
0
MaxCompute studio与权限那些事儿

背景知识 MaxCompute拥有一套强大的安全体系,来保护项目空间里的数据安全。用户在使用MaxCompute时,应理解权限的一些基本概念: 权限可分解为三要素,即主体(用户账号或角色),客体(表/...

阿里云官方博客
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部