gcc编译程序的流程

>>gcc编译器

gcc编译器:(C语言的编译器gcc/g++)

gcc编译程序的流程

源文件(.c)——>预处理(.i)——>编译——>汇编(.s)——>链接(.o)——>可执行文件

(filename.c)    (预处理器)(编译器)(汇编器) (连接器)  (excutefile)

编译运行五部曲:(一般就三步:对c文件直接编译后直接生成可执行文件后运行

gcc bcard.c    gcc -o bcard bcard.c     ./bcard

-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

 

1,  c语言(.c)-->预处理文件(头文件和宏定义处理文件,很大)(.i)

语句:$ gcc -E bcard.c -o bcard.i

 

2,  预处理文件(.i)-->汇编文件(.s)

编译:该选项只进行编译而不进行汇编,结果生成汇编代码。

语句:$ gcc -S bcard.i -o bcard.s

 

3,  汇编文件(.s)-->目标二进制文件(.o)

汇编:把汇编语言翻译成机器语言的过程称为汇编。

语句:$ gcc -c bcard.s -o bcard.o

 

4,  目标二进制文件(.o)-->可执行文件(文件名)

.o文件中并没有函数的实现,必须经过链接才能将函数的实现加载到.o文件中,最终生成二进制的可执行文件

(改名)语句:$ gcc bcard.o -o bcard

5,  运行该程序(./文件名)

语句:$ ./bcard

原文地址:https://www.cnblogs.com/-lhy-to-s/p/10664876.html

时间: 2024-11-09 00:43:43

gcc编译程序的流程的相关文章

linux GCC编译程序的过程

使用gcc编译程序时,编译过程可以细分为四个阶段: 预处理 预处理过程读入程序源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换.预处理过程会删除程序中的注释和多余的空白字符. 编译 编译阶段中,gcc首先检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言. 汇编 汇编阶段是把在编译阶段产生的汇编文件转成目标代码. 链接 将编译输出的文件链接成最终可执行的二进制文件 如图: 示例: vi hello.c #include <s

ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()&#39;问题

网上的解释是:“ you need to add -lstdc++, or use 'g++' rather than 'gcc' as your driver program.”,也就是说如果想要使用g++编译程序的话,那么链接时需要添加“-Istdc++”. 我试了一下 , 在链接时加上"-Istdc++",就没有问题了. 关于g++,让我想起了,在ubuntu下一开始安装完code::blocks的时候,提示需要安装g++.原来code::blocks内置编译器使用的是g++,但

C语言 gcc 编译程序

C语言 gcc 编译程序 上篇博客写到了 编写HelloWorld,不管是通过IDE还是记事本最终的验证结果还是需要运行程序来核验,C语言在编写完成后需要通过gcc编译成可执行程序来进行使用,下面我会进行说明. C语言 编译过程 一.C程序编译步骤 C代码编译成可执行程序经过4步: 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3)汇编:将汇编文件生成目标文件(二进制文件) 4)链接:C语言写的程序

减小Gcc编译程序的体积

众所周知,Gcc编译的原始程序一般很大,其实有几种方法能大大减小目标代码的体积,一般有以下几种方法. 基本知识来源:http://www.mingw.org/wiki/Large_executables 1.禁用调试信息 Release编译时不要加上-g开关. 2.使用-Os编译程序. 不要使用-funroll-loops等可以加速程序执行但是会大大增加目标代码体积的开关. 3.编译后的程序使用strip去除符号和偏移(限于可执行程序和共享库,其他易出问题). 4.如果你不需要RTTI,编译时加

20145216史婧瑶 《信息安全系统设计基础》第2周学习总结

20145216史婧瑶 <信息安全系统设计基础>第2周学习总结 教材学习内容总结 一.VIM 1.hjkl所表示的即为光标 ←↓↑→,前提是要在normal的状态下.方便记忆j像一个笔就像下箭头. ·i → Insert 模式,可插入文本.按 ESC 回到 Normal 模式. ·A → 输入欲添加文本(在一行后添加文本).按 ESC 回到 Normal 模式. ·x → 删当前光标所在的一个字符. ·:wq → 存盘 + 退出 (:w 存盘, :q 退出) 2.删除类命令: 该命令为操作符d

20145326蔡馨熠《信息安全系统设计》第2周学习总结

20145326蔡馨熠<信息安全系统设计>第2周学习总结 教材学习内容总结 一.计算机系统与链接 信息就是位+上下文,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文.ASCII字符构成的文件是文本文件,所有其他文件都是二进制文件. 文件是字节序列 Hello程序的生命周期从高级C语言程序开始,每条C语句被转化为一系列“低级机器语言”指令,然后这些指令按照“可执行目标程序”的格式打包,并以二进制磁盘文件的形式存放起来,目标程序也称为“可执行目标文件”. 源文件到目

信息安全系统设计基础第三周学习总结—20135227黄晓妍

一.Vim编辑器 1.Vim的六种模式 2.Vim三种常用模式的使用方式,以及三者的切换.打开Vim即默认进入普通模式,按i进入插入模式,按esc从插入模式退出普通模式,再按:进入命令行模式. 普通模式下游标的移动 按键 说明 h 左 l 右(小写L) j 下 k 上 w 移动到下一个单词 b 移动到上一个单词 普通模式进入插入模式的方式 命令         说明 i        在当前光标处进行编辑 I        在行首插入 A       在行末插入 a       在光标后插入编辑

20135218 信息安全系统设计基础第二周学习总结

深入理解计算机系 Linux基础 一.实验说明 环境登录  无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 二.实验步骤 三种知识: 元知识:这门课程思考问题框架是什么?遇到老问题,它会怎样分析?遇到新问题,它会怎样分析? 硬知识:这门课程的主要知识点是什么?适合用思维导图组织吗? 软知识:这门课程的哪些知识点需要哪些实践环节来强化理解和记忆? 1. Linux命令 Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,

20135220谈愈敏--信息安全系统设计基础第二周学习总结

<深入理解计算机系统>实验一 在我的理解中: 元知识:思考问题的能力 硬知识:可见的知识点 软知识:实践中的经验 后面的常用命令是老师上课中讲到的. 一边看提供的材料一边在实验楼里实践,我的实验顺序如下: vim编辑器实验1234 普通模式(Normal mode):在普通模式中,用的编辑器命令,比如移动光标,删除文本等等.这也是Vim启动后的默认模式. Vim强大的编辑能来自于其普通模式命令.普通模式命令往往需要一个操作符结尾.例如普通模式命令dd删除当前行,但是第一个"d&quo