HeLei Blog

程序的编译与链接

编译过程预览

img01

预处理

  • 预处理(Prepressing) : -E 表示只进行预处理, 即 : gcc –E hello.c –o hello.i
    • 展开所有 #define 定义的宏
    • 处理所有条件预编译指令,如 #if, #ifdef
    • 递归的将 #include 的文件插入到该预编译文件中
    • 删除各类注释
    • 添加行和文件标识,如 #2 “hello.c” 2 ,用于调试或编译出错报警
    • 保留所有的 #pragma 编译指令,编译器要使用
  • 对于C++ 来说,预处理后的文件扩展名是 .ii

编译

  • 编译(Compilation): gcc –S hello.i –o hello.s
    编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件.
  • 现在的gcc 把预处理和编译两个步骤合成一个步骤,C语言使用一个叫做 cc1 的程序来完成,C++则是 cc1plus ,位于 /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/
  • gcc 实际上是这些后台程序的包装,它会根据参数要求去调用 cc1(cclplus), 汇编器 as 和链接器 ld

链接

  • 链接(Linking):解决一个程序被分割成多个模块后,模块间最后如何组合成一个单一程序的问题.
  • 链接的主要任务是把各个模块之间相互引用的部分处理好,使各个模块之间能正确的衔接.
坚持原创技术分享,您的支持将鼓励我继续创作!