linux编译器 gcc /g++使用及预处理,编译,汇编,连接的相关知识

一.背景知识

1.预处理(进行宏替换)

2.编译     (生成汇编)

3.汇编    (生成机器可识别代码)

4.连接      (生成可执行文件或库文件)

linux编译器 gcc /g++使用及预处理,编译,汇编,连接的相关知识

以上是简介,接下来详细讲解

二  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原始程序


2linux编译器 gcc /g++使用及预处理,编译,汇编,连接的相关知识


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优化级别最高