一起talk GCC吧(第三回:GCC编译)

各位看官们,大家好,上一回咱们说了如何使用GCC。这一回咱们说说如何使用GCC进行编译,闲话休提,

言归正转。让我们一起talk GCC吧!

看官们,GCC编译分为四个阶段:预处理,编译,汇编和链接。下面咱们说说每个阶段如何进行编译,还

是哪句话:说编译本质上就是说GCC的选项。因为不同的选项可以控制不同的编译。

预处理阶段:

该阶段使用的选项是E,会生成预处理后的产物。咱们举个例子:gcc -E filename.c这时不会生成

文件,而是把生成结果显示在执行命令的终端中。所以使用E选项时一定和o选项一起使用,这样

可以把预处理的产物写到o选项指定的产物中。例子:gcc -E filename.c -o f.i.我们可以使用文本编

辑器gedit或者VIM打开f.i文件查看。

编译阶段:

该阶段使用的选项是S,会生成编译后的产物,与就是汇编语言的源文件,文件后缀为.s。咱们举

个例子:gcc -S filename。或者gcc -S filename -o f.s.因为S选项可以默认生成filename.s文件,所

以是否使用选项o指定一个专门的文件,取决于用户自己,当然了,为了统一操作,建议大家还是

使用选项o指定一个文件。关于filename特别说明一下,    它即可以是C程序源文件,如filename.c。

也可以是预处理器生成的文件,如filename.i。不论使用哪种文件,都可以生成filename.s文件,而

且生成的文件完全一样。

汇编阶段:

该阶段使用的选项是c,会生成汇编后的产物,也就是没有链接的目标文件,文件后缀为.o。咱们举

个例子:gcc -c filename.gcc -c filename -o f.s.因为c选项可以默认生成filename.o文件,所以是否

使用选项o指定一个专门的文件,取决于用户自己,当然了,为了统一操作,建议大家还是使用选

项o指定一个文件。这点和选项S一样。在这里专门说下filename。它可以是C/C++语言的源文件,

也可以是编译器产生以.s为后缀的汇编源文件,甚至是使用预处理器生成的以后缀为i的文件都可以。

链接阶段:

该阶段不使用任何选项,会生成链接后的产物,也就是可执行的目标文件,文件后缀为.o。咱们举

个例子:gcc filename -o f.o.这里的filename可以用C/C++的源文件,或者是前面阶段生成的产物

来替换。比如.i,.s,.o文件。

下面我用一个表格来总结各个阶段使用的GCC选项,各个阶段可以处理的文件,我们叫它输入文件吧,以

及各个阶段的产物,我们叫它输出文件也可以。

阶段 选项  参数(输入文件类型)

  产物(输出文件类型)
预处理  E .h,.c(c语言).C,.cc,.cxx(c++语言) .i(c语言),.ii(c++语言)
编译  S .i,.h,.c(c语言).C,.cc,.cxx(c++语言) .s(生成汇编语言源文件)
汇编 c .i,.s,.h,.c(c语言).C,.cc,.cxx(c++语言)  .o(没有进行链接的目标文件,不能运行)
链接 .i,.s,.o,.h,.c(c语言).C,.cc,.cxx(c++语言) .o(有链接的目标文件,可以运行)

通过上面的表格,以及对各个选项的说明,我们可以发现GCC的各个阶段都是相互独立的,它既可以使用

前一个阶段的产物,也可以直接使用C/C++的源文件。各个阶段都是向后兼容,可以独立处理自己阶段中

的事情,也可以处理前面阶段没有处理的事情。

看官们,关于GCC的内容,今天咱们就说这些。欲知后事如何,且听下回分解!

时间: 2024-10-29 19:09:41

一起talk GCC吧(第三回:GCC编译)的相关文章

gcc g++支持C++11 标准编译及其区别

g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:http://stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc 方法1:写Makefile 方法2:取别名 :alias g++11="g++ -std=c++11" -----------------------

window安装gcc、g++、make等编译环境

1. MinGW官网下载:http://www.mingw.org        点击右上角Downloads 点击下载 mingw-get-setup.exe 2. 百度网盘(2019年4月从官网下载的):      链接:https://pan.baidu.com/s/10_OpGlqu2nBG6OI9Y7iFJA      提取码:3z9t 安装 mingw-get-setup.exe直接默认安装就好了,如果不想安装在C盘,修改的安装路径最好不要有空格(我自己的安装路径有空格好像也没遇到什

GCC编程四个过程:预处理-编译-汇编-链接

在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC快速入门Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out我们来看一下经典入门程序"Hello World!"# vi hello.c #include <stdlib.h>#include <stdio.h>void main(void){printf("he

第三回:羁旅客忆碌碌旧事 暴雨天里依依惜别[林大帅作品连载]

第三回:羁旅客忆碌碌旧事 暴雨天里依依惜别诗云:众位觊觎自难群,乱战夺魁是孤军 .韶华三载生旧梦,谁道栀花总负春.              却说林二一行粗览书院与南普陀寺之后,兴致不减.其中一头发中分者谓林二道:“见大哥哥你一路话语不多,眉宇间似有忧郁之气,必是个有故事之人.且我等皆出于文会,何不谈谈书院当年旧事?”说罢略觉唐突,故吐舌一扮鬼脸.林二抿了口咖啡,不禁苦笑,心里万分焦虑,此时却不好表露.便理了理思绪,叨起荔城文会旧事.      话说这荔城者,古称兴化,素有“文献名邦”雅号.于宋

缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度HttpModule有一个了解,可以先看我的这篇文章<开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件> 对于文件级缓存来说,我们要知道两点,一为文件的URL,二为文件的 下面是HttpModuleCache的核心代码 /// <summary> ///

【转】gcc降级到4.4,编译android,Ubuntu12.04

1. 查看gcc版本和g++版本 :/usr/bin$ ls -l gcc*lrwxrwxrwx 1 root root 7 Aug 30 19:26 gcc -> gcc-4.6-rwxr-xr-x 1 root root 353216 Apr 16 07:37 gcc-4.6 :/usr/bin$ ls -l g++*lrwxrwxrwx 1 root root 7 Mar 14 04:05 g++ -> g++-4.6-rwxr-xr-x 1 root root 357312 Apr 1

CentOS 7 构造GCC 4.8.2 32位编译环境

centos 7 构造gcc 32位编译环境 1引言 1.1背景 学习新的 C++ 2011和C11标准. 1.2使用软件 CentOS 7(Linux version 3.10.0-123.el7.x86_64) gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) 1.3本次配置 32位gcc 开发环境. 因为 RHEL 7(红帽企业版 linux 7)已经不再提供32位版本,短期内 CentOS 7也不会提供32位的版本,故为了考虑升级和研究可用的操作

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

GCC学习 (三)如何编写makefile

更多惊喜,请google“跟我一起写Makefile” 本文是该makefile教程的简明版 makefile 基本格式 : -------------------------- 要生成的文件:依赖的文件 实际命令 -------------------------- 执行make时,实际上生成的是第一个文件中要生成的文件,但是第一个要生成的文件,有依赖文件,所以就会继续寻找下一个要生成的文件 make命令是一个递归的过程,本身不包含gcc的过程 命令 如果冒号:后面没有依赖,则这是一个命令,使