zoukankan      html  css  js  c++  java
  • 编译与链接

      对于目前的应用程序开发,我们很少关注编译和链接的过程,通常都使用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常用参数:

  • 相关阅读:
    Asp.net routing vs Url rewriting
    How to combine WCF Route and MVC Route to work together.
    Servlets beat CGI
    What if you encounter a problem when consume your WCF service ? How to Diagnostic it ?
    uva 4965 Sum the Square
    zoj 3633 Alice's present
    4966 Normalized Form
    ZOJ 3015 Collision Ball Game
    二分图 最小路径覆盖
    uva 2696 Air Raid
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/9412604.html
Copyright © 2011-2022 走看看