0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C程序的完整编译过程

CHANBAEK 来源:郎哥编程课堂 作者: 郎宏林 2023-11-15 17:14 次阅读

本文讨论了C程序的完整编译过程,分别讲述了预处理、编译、汇编、链接各阶段完成的编译任务。然后通过一个编译实例,探讨了各阶段输出的文件。

编译和链接

前面了解C程序结构,也编写了第一个C程序源代码,但计算机并不能直接执行C程序源代码。因为C语言是高级语言,计算机不能识别高级语言编写的代码,还需要把写好的C程序源代码转换为计算机能识别的机器语言代码,这个过程称为C程序的编译过程。编译过程如图1-7所示。

图片

图 1-7 C程序编译过程

从图1-7可以看出,C程序编译过程分为四个阶段:第一阶段是预处理阶段;第二阶段是编译阶段;第三阶段是汇编阶段;第四阶段是链接阶段。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了C语言的编译系统。

预处理阶段:预处理阶段主要用于处理源文件中的预处理指令,并根据指令对源代码进行修改和补充。例如:“#include”指令将头文件的内容补充到源文件内;“#define”指令用于宏定义,通过宏定义可以进行条件编译和内容替换。

编译阶段:编译阶段主要用于对预处理后的文件进行词法和语法分析,并将其翻译成与源代码等价的汇编代码。

汇编阶段:汇编阶段将编译输出的汇编代码转换为机器代码,机器代码也称为目标代码,该代码与计算机硬件相关。

链接阶段:链接阶段将多个目标代码文件、函数库文件链接成可执行文件。

**编译实例 **

下面以《C程序结构》中的面积计算器程序为例,在Ubuntu系统下使用GCC编译器,对面积计算器程序进行编译和链接。

面积计算器程序可以计算长方形、正方形、平行四边形和三角形的面积,它由main.c、rectangle.c、square.c、paraller.c、triangle.c、area.h五个源文件和一个头文件构成,area.h头文件描述了面积计算函数的原型。面积计算器程序结构如图所示。程序代码请参见《C程序结构》。

图片

图 1-8 面积计算器程序结构

预处理阶段

预处理阶段主要处理C程序源文件内的预处理指令,如#include指令、宏定义等。预处理阶段会对所有的C源文件进行预处理,预处理后的文件也是文本文件,可以使用文本编辑器打开,不过其文件大小要比C源文件大的多,因为预处理后的文件会将#include指令引入的头文件写入到C源文件内。面积计算器的main.c文件使用了#include指令,主要代码如下:

//引入C语言标准输入输出函数库
//stdio.h是标准输入输出函数库的头文件
#include
//引入面积计算器函数头文件
include "area.h"
void main()
{
……
}

GCC编译器提供了如下命令对C源文件进行预处理:

gcc -E C源文件-o [预处理后文件]

例如:

gcc -E main.c -o main.i

对main.c文件进行预处理,预处理后的文件为main.i。执行上述预处理命令时,需要gcc能够找到main.c文件。

main.c预处理后文件main.i要比main.c大很多,感兴趣的同学可以实际操作后,用文本编辑器打开main.i文件,看看里面的内容。

图片

面积计算器程序所有C源文件预处理后的文件列表,从列表中可以看出,除了main.c文件外,其它预处理后文件和C源文件大小变化不大,这是因为这些C源文件没有包含头文件。

图片

编译阶段

编译阶段将预处理后文件转换为汇编代码,编译后的汇编代码也是文本文件,可以直接使用文本编辑器打开汇编代码。

GCC编译器提供了如下命令对预处理后文件进行编译:

gcc -E 预处理后文件-o [汇编代码]

例如:

gcc -S square.i -o square.s

对square.i文件进行编译,编译后的文件为square.s。执行上述预处理命令时,需要gcc能够找到square.i文件。

编译后汇编代码如下图所示:

图片

汇编阶段

汇编阶段将汇编代码转换为机器代码(机器可以直接执行的CPU指令),转换程序也称为汇编程序。由于不同CPU架构的计算机,其提供的指令集不同,支持运行的机器代码也不同,因此,要运行在不同CPU架构的计算机上,就需要运行支持该CPU架构的汇编程序。例如IBM-PC机采用了Intel X86系列处理器,单片机一般采用ARM架构的系列处理器,如果要让编写的汇编程序运行在IBM-PC机上,就需要调用支持IBM-PC指令集的汇编程序,如果要让编写的汇编程序运行在ARM架构的计算机上,就需要调用支持ARM指令集的汇编程序。

汇编阶段输出的文件为目标文件,它是二进制格式,不能使用文本编辑器浏览文件内容。GCC编译器提供了如下命令对C源文件进行预处理:

gcc -c 汇编代码文件-o [目标文件]

例如:

gcc -c rectangle.s -o rectangle.o

对rectangle.s文件进行汇编,汇编后的文件为rectangle.o。执行上述预处理命令时,需要gcc能够找到rectangle.s文件。

汇编阶段执行后,面积计算器程序文件列表如下图所示:

图片

链接阶段

面积计算器程序在汇编阶段输出了main.o、square.o、triangle.o、rectangle.o、paraller.o目标文件,在链接阶段需要将这些目标文件链接为可执行文件。链接使用ld命令,ld是GCC提供的链接器,将目标文件与函数库链接为可执行程序或库文件。不过ld链接器一般不独立使用,由GCC自动调用链接器。

输入下面的命令:

gcc main.c paraller.c rectangle.c square.c triangle.c

即可完成面积计算器程序的编译和链接。

本文小结

通过以上分析可知,C程序的编译过程要经过预处理、编译、汇编和链接四个阶段。令人欣慰的是C程序编译工具都提供了一次性编译和链接命令,编译器会自动执行这四个阶段,不需要开发者的参与。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32867
  • C程序
    +关注

    关注

    4

    文章

    254

    浏览量

    36030
  • 汇编代码
    +关注

    关注

    0

    文章

    23

    浏览量

    7551
  • 宏定义
    +关注

    关注

    0

    文章

    50

    浏览量

    9009
收藏 人收藏

    评论

    相关推荐

    C语言的编译过程

    C语言的编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),
    发表于 06-25 10:36 414次阅读
    <b class='flag-5'>C</b>语言的<b class='flag-5'>编译</b><b class='flag-5'>过程</b>

    C语言的编译链接过程

      C语言的编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码)
    的头像 发表于 08-21 10:06 2595次阅读
    <b class='flag-5'>C</b>语言的<b class='flag-5'>编译</b>链接<b class='flag-5'>过程</b>

    使用scons编译时,需要怎么做才能输出gcc的完整编译信息呢?

    使用scons编译时,我需要怎么做才能输出gcc的完整编译信息呢?目前sconsCC ......期望输出arm-none-eabi-gcc -O2 ....
    发表于 04-02 14:19

    使用scons编译时,我需要怎么做才能输出gcc的完整编译信息呢?

    使用scons编译时,我需要怎么做才能输出gcc的完整编译信息呢?目前sconsCC ……期望输出arm-none-eabi-gcc -O2 ….
    发表于 03-23 11:20

    C语言入门教程-C程序编译过程解析

    C程序编译过程解析 让我们逐行讲解一下这个示例程序,看看每一行都做了什么(点击这里在新窗口中打开程序
    发表于 07-29 10:28 952次阅读

    C语言实现运算器的原理完整编程代码

    C语言实现运算器的原理 完整编程代码C language implementation of the principle of the operator complete programming code
    发表于 07-08 11:33 4次下载

    了解“预编译编译、汇编、链接”这四个过程对你有很大帮助

    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码)
    的头像 发表于 04-18 10:08 3.6w次阅读
    了解“预<b class='flag-5'>编译</b>、<b class='flag-5'>编译</b>、汇编、链接”这四个<b class='flag-5'>过程</b>对你有很大帮助

    GCC编译C语言程序过程是怎么样的

    使用GCC将C语言源代码文件生成可执行文件的过程,需要经历四个的步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)
    的头像 发表于 02-18 11:47 4097次阅读

    单片机C程序编译、执行过程资料下载

    电子发烧友网为你提供单片机C程序编译、执行过程资料下载的电子资料下载,更有其他相关的威廉希尔官方网站 图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大
    发表于 04-08 08:42 14次下载
    单片机<b class='flag-5'>C</b><b class='flag-5'>程序</b><b class='flag-5'>编译</b>、执行<b class='flag-5'>过程</b>资料下载

    解析C语言编译过程中所做的工作

    C语言的编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),
    的头像 发表于 06-27 10:21 3166次阅读
    解析<b class='flag-5'>C</b>语言<b class='flag-5'>编译</b><b class='flag-5'>过程</b>中所做的工作

    TKScope对LPC1700系列芯片的完整编程和加密方法

    电子发烧友网站提供《TKScope对LPC1700系列芯片的完整编程和加密方法.pdf》资料免费下载
    发表于 10-13 17:50 0次下载
    TKScope对LPC1700系列芯片的<b class='flag-5'>完整编</b>程和加密方法

    TKScope对LPC1300系列芯片的完整编程和加密方法

    电子发烧友网站提供《TKScope对LPC1300系列芯片的完整编程和加密方法.pdf》资料免费下载
    发表于 10-13 17:49 0次下载
    TKScope对LPC1300系列芯片的<b class='flag-5'>完整编</b>程和加密方法

    TKScope对AT91SAM7X256的完整编程和加密方法

    电子发烧友网站提供《TKScope对AT91SAM7X256的完整编程和加密方法.pdf》资料免费下载
    发表于 10-13 17:23 1次下载
    TKScope对AT91SAM7X256的<b class='flag-5'>完整编</b>程和加密方法

    RX族C/C++编译程序、汇编程序、优化连接编辑程序 编译程序包 用户手册 Rev.1.00

    RX族C/C++编译程序、汇编程序、优化连接编辑程序 编译程序包 用户手册 Rev.1.00
    发表于 04-17 19:24 0次下载
    RX族<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>编译程序</b>、汇编<b class='flag-5'>程序</b>、优化连接编辑<b class='flag-5'>程序</b> <b class='flag-5'>编译程序</b>包 用户手册 Rev.1.00

    SuperHTM RISC引擎C/C++编译程序、汇总程序、优化连接编译程序 编译程序包V.9.01 用户手册

    SuperHTM RISC引擎C/C++编译程序、汇总程序、优化连接编译程序 编译程序包V.9.
    发表于 05-04 18:40 0次下载
    SuperHTM RISC引擎<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>编译程序</b>、汇总<b class='flag-5'>程序</b>、优化连接<b class='flag-5'>编译程序</b> <b class='flag-5'>编译程序</b>包V.9.01 用户手册