linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段
gcc的编译流程分为四个步骤,分别为:
预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
链接(Linking)
gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项]
[目标文件]
其中,目标文件可缺省,gcc默认生成可执行的文件名为:编译文件.out
如:#gcc -o hello hello.c
该命令将hello.c直接生成最终二进制可执行程序a.out
这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。
如何要指定最终二进制可执行程序名,那么用-o选项来指定名称。比如需要生成执行程序hello.exe
那么
#gcc hello.c -o hello.exe
下面就具体来查看一下gcc是如何完成四个步骤的:
(1)预处理阶段
预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。
在该阶段,用户可以使用gcc的选项”-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。
预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。如hello.c中#include
指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果就得到另外一个C程序,以.i作为文件扩展名。
命令:gcc –E hello.c –o
hello.i
(2)编译阶段
在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译
成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。汇编语言是非常有用的,它为不同高级语言不同编译器提供
了通用的语言。
命令:gcc –S hello.i –o hello.s
(3)汇编阶段
汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。
命令:gcc –c hello.s –o hello.o
(4)链接阶段
在成功编译之后,就进入了链接阶段。将编译输出文件hello.o链接成最终可执行文件hello.exe
命令:gcc hello.o –o hello.exe
运行该可执行文件,出现正确的结果如下。
命令:./hello
Hello World!
一般的,我们不需要一步一步输命令查看整个的编译过程,我们通常一步生成或两步生成。
命令:
一步:gcc -o hello hello.c
两步:gcc -c hello hello.c
gcc -o hello hello.o
输出结果: ./hello
linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段相关推荐
- Linux下的编译(环境是centos6.8 gcc 4.4.7)
Linux下的编译(环境是centos6.8 gcc 4.4.7) 1. 运行命令:yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs Pytho ...
- 从四个问题透析Linux下C++编译链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- Linux下Nginx编译安装过程详解
Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...
- linux postgresql 创建数据库,Linux下创建Postgresql数据库的方法步骤
Linux下创建Postgresql数据库的方法步骤 前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行. ...
- Linux下静态编译的一个TIP
Linux下静态编译的一个TIP | 素包子 Linux下静态编译的一个TIP 2010年3月28日 baoz 阅读评论 linux下静态编译好处很多,一来是可以跨发行版(debian redhat ...
- linux apache 安装 rewrite,linux下单独编译安装Apache rewrite_module
Redhat linux下单独编译安装Apache rewrite_module Apache已经编译安装完了,今天弄了个lifebox,装完后发现必须得用rewrite,所以就给它装了个~~ 找到a ...
- Linux下Nginx编译安装后的开机自启动设置
Linux下Nginx编译安装后的开机自启动设置 一.查看当前Nginx启动状态 二.而配置Nginx相关服务文件 三 .设置nginx命令 四.设置开机启动 五.测试开机启动 一.查看当前Nginx ...
- linux下mysql-5.5.15安装详细步骤
linux下mysql-5.5.15安装详细步骤 注:该文档中用到的目录路径以及一些实际的值都是作为例子来用,具体的目录路径以各自安装时的环境为准 mysql运行时需要一个启动目录.一个安装目录和一个 ...
- Linux下多线程编译
linux下多线程编译注意事项: 编译时加入 -lm -lpthread参数 参数说明:-lm 使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm ...
- Linux下nginx编译安装,重新添加模块
Linux下nginx编译安装,重新添加模块 前言:编译完成后的Nginx,当我们需要新的功能模块时,要怎么重新添加呢?可以按照下面的方法试试. 1.查看nginx版本以及编译安装模块 [root@# ...
最新文章
- Arcface v1 论文翻译与解读
- mysql数据库主从配置
- 经典笔试题:用C写一个函数测试当前机器大小端模式
- C语言写300k文件大概多少行,为什么 DELPHI 编译出的程序一般的来说至少都有300k呢?...
- 同步工具之Semaphore信号量
- C#图解教程 第二十四章 反射和特性
- H3CTE讲师分享H3C认证培训实验9 IP基础
- github fork自己的库,如何同步源库的更新
- html5 逐帧播放 代码,html5-video – 使用媒体源扩展进行逐帧解码
- 星河互联刘玮玮:Echo卖疯了,为什么擅长制造爆款的中国人又没跟上?
- applet java_Java applet 类
- python自学之《21天学通Python》(2)
- 【rose】rose框架学习总结
- mysql实体指的是_数据库中,实体是指( )。
- 4.1Reduction模型
- java polygon 用法_Java Polygon.getBounds方法代码示例
- Java公历(阳历)转换农历(阴历)工具类
- 冯诺依曼计算机的运行原理
- 3.Java获得内网网段所有可通信的ip地址
- 瑞萨IDE:CS+ for CC下载、安装和基础使用
热门文章
- python股票量化交易(8)---K线图:锤头,射击之星,早晨之星
- linux查看wifi网速,无线信号强度解析及linux如何查看wifi信号强弱等
- 简述python的书写规则_python3 基本书写规范
- 小丸子学Oracle 12c系列之——Oracle Pluggable Database
- uni-app - APP平台禁止页面滑动(无法上下滚动屏幕页面)
- 简单了解一些分布式术语,分享给大家
- 计算机操作系统原理--Linux实例分析
- 【Axure教程】中继器表格自动合计模板
- 《GPU高性能编程》——gl_helper.h
- 什么是FPGA工程师的核心竞争力