C语言的编译和链接

本文参考https://www.cnblogs.com/zzdbullet/p/9911226.html

c语言的编译和链接

预编译

  • 首先是预先处理头文件,把头文件的函数都输入到输出文件中,所以在这个输出文件中将不再有包含头文件的指令,这个头文件并不是值我们最终的这个头文件,而是经过预处理以后输出的头文件
  • 其次是处理一些宏定义,对于宏定义语句,比如#define NAME “user”,则在预编译阶段,会将程序中所有的NAME都替换为usr,当前有一点值得注意的是字符串中的NAME是不会被替换的。而#define语句在经过预编译后的代码中则不会出现。宏定义中还有一个#undef,对于它的处理是从取消的位置开始,后面的代码中都不会进行替换了,同样的经过预编译后的代码不会有#undef语句了。
  • 对于条件编译语句指的是#ifdef、#else、#ifndef、#elif、#endif、(注意还有#if)。条件编译指的是——如果#ifdef debug,如果定义了debug,那么后面部分的代码就会被编译,否则编译#else后的代码。对于条件编译语句,在预编译阶段处理它,是根据它过滤掉那些不必要的代码。

编译

  • 在编译之后将生成新的源文件,也就是我上面说的预编译生成的输出文件,进行词法分析和语法分析,在经过编译之后的文件会变成中间代码或者汇编文件

汇编

  • 汇编就是对编译生成的汇编代码转换成机器代码。这个时候已经基本成型,但是并不能运行,因为还需要链接

链接

  • 链接就是把上面的机器代码和系统中的函数库进行链接,比如_print , _scanf 函数,链接之后程序才能被执行
  • 链接还分为静态链接和动态链接
    • 静态链接,就是直接把系统中的函数一次性写入输出文件
    • 动态链接,是用到的时候在进行链接

在这里插入图片描述