编译与链接

  对于目前的应用程序开发,我们很少关注编译和链接的过程,通常都使用IDE将编译和链接一部完成,以下使对于编译和链接的过程的具体解析。

首先,要生成机器可以识别的二进制文件,必须经过以下几个步骤:

  预处理 ------> 编译 -------> 汇编 ---------> 链接

一、预处理

 预处理的过程主要处理源文件中以“#”开始的预编译指令。比如“#include”、“#define”等,处理规则如下:

   1、将所有的”#define“删除,并且展开所有的宏定义。

   2、处理所有条件预编译指令,比如“#if”、"#ifdef","#elif",“#else”,"#endif".

   3、将#include的文件插入到预编译指令的位置。注意,这个过程使递归进行的,因为被包含的文件中可能还包含其他文件。

     4、删除所有的注释“//”和“/* */”。

   5、添加行号和文件名标识。

   6、保留所有的#pragma编译器指令,因为编译器要使用它们。

以下用我们熟悉的hello world程序来了解此过程:

#include<stdio.h>
int main()
{
   printf("
hello,word
");  
    return 0;
}

预编译命令:gcc -E hello.c -o hello.i

二、编译

编译过程就是把预处理完成的文件进行一系列的词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。

 使用编译命令执行hello.i文件生成汇编文件:

gcc -S hello.i -o hello.s

 

三、汇编

  汇编器是将hi便代码变成机器可以执行的指令,每一条汇编语句对应一条机器指令最终输出目标文件。

gcc -c hello.s -o hello.o

四、链接

链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

gcc -o hello hello.o

gcc常用参数:

原文地址:https://www.cnblogs.com/yuanqiangfei/p/9412604.html