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)是一种对象 ...
随机推荐
- Dubbo源码学习(二)
@Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...
- LISTAGG函数
官网进入 该函数作用是可以实现对列值得拼接: 根据官网介绍,可以对列值排序进行拼接,也可以分组拼接 1.1运行结果 1.2运行结果 2运行结果 注意该函数提供的 over( partition by ...
- 记一次MySQL表分区操作
最近一次日常迭代中,业务线需要对一张大表进行联合查询,查询性能可想而知,测试过程中服务接口直接响应超时,导致服务不可用,最后临时对该表进行分区操作,暂时缓解性能问题.由于是第一次操作表分区,姑且记录一 ...
- 斑马难题Step by Step
问题描述 分析 代码 在exercism.io被这个 Zebra Puzzle 难住了.这里一步一步的解决... 1.There are five houses. 2.The Englishman l ...
- 教你如何去除电脑QQ聊天窗口上的广告?
当打开QQ聊天窗口时,就如下图一样各种广告不停地闪啊闪的,我没强迫症但是我也不喜欢看. 像咱们这些没有钱开会员又不喜欢整天看电脑QQ聊天窗口上的广告的"穷人们".那该咋办呢?好了, ...
- C++走向远洋——68(十六周、文件)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Docker 运行容器 CentOS7 使用systemctl 启动报错 Failed to get D-Bus connection: Operation not permitted
原系统:Centos 7 Docker 版本:1.12.6 操作:安装并运行 Tomcat 问题:在创建好容器之后,并且进入系统运行启动tomcat [root@cd11558d3a22 /]# sy ...
- 【阿里云IoT+YF3300】16.云端一体化,天猫精灵操控YF3300
“你好天猫精灵”,“主人有什么吩咐”,“打开灯”,“好的,灯已打开”.对于这样的对话应该大多数人都很熟悉,这就是智能家居的缩影.对于现在市面上层出不穷的智能家居系统,功能越来越繁杂,可是因为开发难度高 ...
- Ubutun18.04安装Python3.7.6
最近因为环境问题,简单记录下Python3.7的安装过程: 下载地址:http://python.org/ftp/python/3.7.6/Python-3.7.6.tgz 编译安装步骤: sudo ...
- Mysql8以上需要指定时区serverTimezone
JDBC连接Mysql8以下 com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...