linux编译器 gcc /g++使用及预处理,编译,汇编,连接的相关知识
一.背景知识
1.预处理(进行宏替换)
2.编译 (生成汇编)
3.汇编 (生成机器可识别代码)
4.连接 (生成可执行文件或库文件)
以上是简介,接下来详细讲解
二 gcc如何完成
1 预处理(进行宏替换)
预处理功能:1.将所有#define删除并展开所有宏定义
2.过滤所有注释“//”和“/* */”中的内容
3.保留所有#pragma编译器指令
4.添加行号和文件名标识比如#2 “test" 2,以便于编译时编译器产生调试用的行号信息,及用于编译时产生编译 错误或警告时可以显示行号
5.处理所有的预处理指令,比如#if #endif 等等
实例:gcc -E hello.c -o hello.i
解释:-E是指让gcc在预处理结束后停止编译过程
-o指目标文件,”i“文件为已经处理过的c原始程序
2
2.编译(生成汇编)
实例:gcc -S hello.i -o hello.s
解释: -S只进行编译,而不进行汇编,生成汇编
编译的步骤:
1.词法分析 //不检查错误
2.语法分析 语法树 //检查出基本简单错误
3.语义分析 中间语言生成
4.优化 汇编代码
3.汇编(生成机器可识别代码)
功能:生成机器可识别代码即可重定位目标文件(因为连接的时候会把程序启动代码等都加进来)
实例 gcc -c hello.s -o hello.o
4.连接 (生成可执行文件或库文件)
功能:把别人写的代码即函数库里面的函数,例如printf,以及程序启动代码等都加进程序中
实例:gcc hello.o -o hello
gcc -O0
-O1
-O2
-O3
以上为四个优化级别,-O0没有优化 ,-O3优化级别最高