c++源文件从文本阶段到可执行文件的过程
过程分为四个阶段:
预处理阶段····>编译阶段····>汇编阶段····>链接阶段
1)预处理阶段:对源代码文件中的文件包含关系、预编译语句(宏定义)进行分析和替换,生成预编译文件。
····删除所有的#define,展开所有的宏定义
····处理所有的条件预编译语句#if、#else、#end if等
····处理所有的 “#include” 预编译指令 ,将文件内容替换到他的位置,这个过程是递归进行的。
····删除所有的注释 //
····保留所有的#pragma 编译器指令,如#pragma once是为了防止头文件互相引用
····添加行号和文件标识,便于编译器在编译时产生的错误能够显示出来
2)编译阶段:对预编译文件进行编译,转为汇编代码,生成汇编文件。
····词法分析
····语法分析
····语义分析
····优化,比如 int a[1] = 0; int a[1] = 2; int a[1] = 3; 编译器会优化,认为只有一个int a[1] = 3;
····目标代码生成,生成汇编代码
····目标代码优化,对汇编代码进行优化,使用合适的寻址方式,使用位运算来代替乘法
3)汇编阶段:将汇编文件转换为特定的机器指令,生成可重定位文件。
····将汇编指令翻译为机器码,生成 .o(windows)或者 .obj(linux)文件。
4)链接阶段:将所有的可重定位文件和库进行链接,最终生成可执行文件。这里的链接位静态链接
c++源文件从文本阶段到可执行文件的过程的更多相关文章
- 一个C++源文件从文本到可执行文件经历的过程
一个C++源文件从文本到可执行文件经历的过程 以Hello World为例进行说明 首先我们编写一个cpp源程序 test.cpp #include <iostream> using na ...
- 在Unix系统上,从源文件、目标文件、可执行文件的编译过程
是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, #include & ...
- c++源文件到可执行文件的过程
1.预处理(preprocessor):对#pragma.#include.#define.#ifdef/#endif.#ifndef/#endif,inline内联函数等进行处理 2.编译(comp ...
- Linux下C语言生成可执行文件的过程
在当前目录下创建一个C源文件并打开: touch test.c gedit test.c直接编译: gcc test.c -o test 分步骤编译: 1) 预处理 gcc -E test.c ...
- 从Spring的几个阶段理解其工作过程
Spring框架非常强大,想要彻底弄懂Spring是非常困难的. 为了便于了解Spring的工作原理,我们来研究一下,Spring是怎么加载的,Spring会经过几个阶段. 我们站在Javaweb ...
- Delphi编程中资源文件的应用
Delphi编程中资源文件的应用/转自 http://chamlly.spaces.live.com/blog/cns!548f73d8734d3acb!236.entry一.引子: 现在的Windo ...
- 可执行文件(ELF)格式之讲解
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自 ...
- 可执行文件(ELF)格式的理解
摘自http://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html 可执行文件(ELF)格式的理解 ELF(Executable an ...
- Linux下的ELF可执行文件的格式解析 (转)
LInux命令只是和Kernel一起被编译进操作系统的存在于FS的ELF格式二进制文件,或者权限足够的脚本,或者一个软链 ELF(Executable and Linking Format)是一种对象 ...
随机推荐
- 从国内APP更新“精雕细琢” 看国内外产品理念之差
看国内外产品理念之差" title="从国内APP更新"精雕细琢" 看国内外产品理念之差"> 对于当下的大众来说,智能手机已经成为新的" ...
- C++走向远洋——47(第十二周、运算符重载基础程序、阅读)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- SpringCloud入门(六): Hystrix监控
Hystrix.stream 监控 <!--. 配置pom文件,引入actuator包--> <dependency> <groupId>org.springfra ...
- Object-C 银行卡,信用卡校验规则(Luhn算法)
最近的项目中涉及到绑定用户的银行卡,借记卡.经过查找银行卡的校验规是采用 Luhn算法进行验证. Luhn算法,也被称作“模10算法”.它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美 ...
- golang在debian下不能用sudo进行使用的问题
sudo ln -s /usr/local/go/bin/go /usr/bin/go 然后就ok了. 去查了下这两个路径的差别,也没查出什么.只是说/usr/bin 是系统预装所在的路径.
- 查询mysql版本号
mysql> select version(); +------------+| version() |+------------+| 5.7.23-log |+------------+1 r ...
- Lambda表达式(JDK8)
在说Lambda表达式之前,先介绍一下函数式接口 函数式接口 就是只定义了一个抽象方法的接口,我们可以使用注解@Functionallnterface,来强约束这种接口为函数式接口.如Runnable ...
- Day06 - Fetch、filter、正则表达式实现快速古诗匹配
Day06 - Fetch.filter.正则表达式实现快速古诗匹配 作者:©liyuechun 简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战.项目免费提供了 30 个 ...
- iOS下的 Fixed BUG
input 光标位置乱窜 固定式浮层内的输入框光标会发生偏移.即 fixed 定位的容器中输入框光标的位置显示不正确,没有正常地显示在输入框中,而是偏移到了输入框外面 可触发条件 页面body出现滚动 ...
- 广告行业中那些趣事系列6:BERT线上化ALBERT优化原理及项目实践(附github)
摘要:BERT因为效果好和适用范围广两大优点,所以在NLP领域具有里程碑意义.实际项目中主要使用BERT来做文本分类任务,其实就是给文本打标签.因为原生态BERT预训练模型动辄几百兆甚至上千兆的大小, ...