编译和链接

—、翻译环境和运行环境

1.翻译环境

1.1.预处理(预编译)

1.2.编译

1.3.汇编

1.4.链接

2.运行环境


正片开始
先让我们看看什么是翻译环境和运行环境
如图片所示
下图为整个翻译环境的细致过程

在这里插入图片描述

1.翻译环境

  • 你们应该很好奇翻译环境在干什么吧?从(图片一)可以看出它先将我们写的源代码(指的是我们所写的代码)进行编译和链接转换成机器语言(2进制)让机器能够读懂,最终生成可执行程序->某某某.exe。
    在这里插入图片描述
    ⼀个C语⾔的项⽬中可能有多个 .c ⽂件⼀起构建,那多个 .c ⽂件如何⽣成可执⾏程序呢?
  • 多个.c⽂件单独经过编译处理⽣产对应的⽬标⽂件。
  • 注:在Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o
  • 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。
  • 链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库
  • 其实翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成:预处理(有些书也叫预编
    译)、编译、汇编三个过程,让我们接着向下深入了解一下这三个小过程吧~

1.1.预处理(预编译)
在预处理阶段有以下几点

  1. 头文件包含,会将头文件里的所有内容拿过来
  2. 用#define定义的变量也会被替换 如#define MAX 100 会将所有使用MAX的替换成100
  3. 以及我们所涉及的条件编译如:#if, #elif, #else, #ifdef, #ifndef, #endif
  4. 注释的删除
  5. 多文件使用时包含这条语句**#pragma once**能有效防止同一份头文件重复包含
    注意:经过预处理之后会生成(某某某.i文件)此文件为中间文件
    1.2.编译
    编译要进行三个过程:词法分析,语法分析,语义分析生成相应的汇编代码文件
    这三个过程比较复杂,我们就粗浅的理解理解,在编译的这个过程会检查语法是否有错误,同时将(.i)文件处理为汇编文件(.s)的过程
    1.3.汇编
    汇编就相对简单了,在编译完之后生成的(.s)文件就是汇编文件,它要经过汇编这个过程生成目标文件(.o)文件,此时目标文件的内容全部转换成了二进制形式,这就是汇编所干的事
    1.4.链接
    链接是翻译环境的最后一步了,此过程非常重要,它要将所有的目标文件(.o)链接成一块完整的exe程序。
    2.运行环境
  6. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序
    的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
  7. 程序的执⾏便开始。接着便调⽤main函数。
  8. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回
    地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程
    ⼀直保留他们的值。
  9. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌

最后提醒一下在编译的三个小过程中:预处理后生成的(.i)文件,编译生成的(.s)文件,以及汇编后生成的(.o)文件都是在gcc下完成的,在其他开发环境下可能后缀会有所差异。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值