GCC 编译过程及每个过程做了那些事(收集)
来源:互联网 发布:osek网络管理 编辑:程序博客网 时间:2024/06/05 00:37
收集自:http://blog.chinaunix.net/uid-20196318-id-28797.html http://blog.sina.com.cn/s/blog_4bab8e7f01011gef.html在使用GCC编译程序时,其编译过程可以分为4个阶段:预处理(Pre-Processing) -> 编译(Compling) -> 汇编(Assembling) -> 连接(Linking) .一、预处理:gcc -v -E filename -o filename.i.i 文件中会显示整个预处理过程,带-v参数,可以在中断看见gcc预处理过程。(-E输出文件,如上面.i文件中#开头的都是需要替换的)这里说明以下,预处理主要作以下几种事情:将所有的#define删除,并且展开所有的宏定义;处理所有条件编译指令,如#if,#ifdef等;处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。删除所有的注释//和 ;添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;保留所有的#pragma编译器指令,因为编译器须要使用它们;include搜索文件时,会在以下几个路径搜索:1.编译的时候指定路径2.gcc的specs里3.使用-I参数指定的路径4.gcc环境变量设置(C_INCLUDE_PATH)include "fllename.h" 先在当前目录寻找,然后再系统目录寻找include <fllename.h> 只在系统目录寻找,找不到报错应用时,用前者包含用户自定义文件,用后者包含系统文件,这样的效率是最高的。系统目录应该是指gcc的specs里所指,形如:/usr/include /usr/local/include/usr/lib/gcc-lib/i386-linux/2.95.2/include/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include二、编译:gcc –S hello.i –o hello.s编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件三、汇编汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。 gcc –c hello.c –o hello.o四、链接链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。
ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o
0 0
- GCC 编译过程及每个过程做了那些事(收集)
- gcc命令及编译过程
- GCC编译及连接过程
- gcc简介及编译过程
- malloc过程中做了那些?
- GCC 编译过程及相关的知识
- gcc 编译过程及有关命令详解
- 【Linux】gcc编译过程及操作
- 编译过程做了哪些事情
- 编译过程做了哪些事情;
- linux GCC编译过程
- linux GCC编译过程
- gcc编译过程概述
- [Pthread] Gcc 编译过程
- gcc编译过程
- linux gcc 编译过程
- gcc 编译过程
- GCC的编译过程
- CSS中@import的问题
- 华为机试——字符串加解密
- 如何更改应用程序加载基地址
- ROS学习笔记(1):在ROS中使用OpenCV进行简单的图象处理--原理篇
- WIN10下配置java jdk
- GCC 编译过程及每个过程做了那些事(收集)
- WebBrowser(IE) 与 JS 相互调用
- java笔试题小记
- 锤子CTO钱晨:加班要么是你笨,要么是工作安排不合理
- 地图,不哭不闹哈
- 《Effective Modern C++》翻译--简介
- java入门学习(1)一简介及其基础特点
- vim 显示行号
- 蓝桥杯 历届试题 核桃的数量 (最小公倍数)