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)是一种对象 ...
随机推荐
- Kafka配置文件及解释
broker.id=0num.network.threads=9num.io.threads=24socket.send.buffer.bytes=102400listeners=PLAINTEXT: ...
- Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名
Apk签名,每一个Android开发者都不陌生.它就是对我们的apk加了一个校验参数,防止apk被掉包.一开始做Android开发,就接触到了apk签名:后来在微信开放平台.高德地图等平台注册时,需要 ...
- C++走向远洋——67(项目二、洗牌)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 一步一步理解AdaBoosting(Adaptive Boosting)算法
最近学习<西瓜书>的集成学习之Boosting算法,看了一个很好的例子(https://zhuanlan.zhihu.com/p/27126737),为了方便以后理解,现在更详细描述一下步 ...
- iptables 开放80端口以及删除80端口的规则
[root@zabbix-server html]# iptables --version iptables v1.4.21 [root@zabbix-server html]# iptables - ...
- Python3——2019年全国大学生计算二级考试
Python语言程序设计二级重点(2019年版) 第一章 程序设计基本方法 IPO程序编写方法 :输入(input),输出(output),处理(process): Python程序的特点: (1)语 ...
- cooking和session
## Cookie ## # 基本概念: >> 用于保存一次会话中的记录,存放在客户端(浏览器); |-- "一次会话" |-- 当客户端打开一个界面时 被称作一次会话 ...
- 7-1 jmu-python-汇率兑换 (10 分)
7-1 jmu-python-汇率兑换 (10 分) 按照1美元=6人民币的汇率编写一个美元和人民币的双向兑换程序 输入格式: 输入人民币或美元的金额,人民币格式如:R100,美元格式如:$100 ...
- How to solve the problem that Github can't visit in China?
find path C:\Windows\System32\drivers\etc\host open DNS detection and DNS query-Webmaster(DNS查询) too ...
- 前端每日实战:1# 视频演示如何用纯 CSS 创作一个按钮文字滑动特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/zhang-ou/pen/GdpPLE 可交互视频教程 此视频 ...