C语言的编译和链接 (内容来自C语言官网,深入学习)

本文介绍了编程中的两个关键步骤:编译将源代码转化为机器可识别的二进制目标文件,链接则将目标文件和系统组件合并成可执行文件。详细解释了可执行程序、编译器和链接器的作用,以及Windows和类UNIX系统的区别。
摘要由CSDN通过智能技术生成

前言

我们平时所说的程序,是指双击后可以打开直接运行的程序,这样的程序被称为可执行程序(Executable program)。在WIndows下,可执行程序的后缀有.exe和.com(其中.exe比较常见);在类UNIX系统(Linux、MaxOS等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。
可执行程序的内部是一系列计算机指令和数据的集合,它们都是二进制形式的,CPU可以直接识别,毫无障碍;但是对于程序员,它们非常晦涩,难以记忆和使用。
例如,在屏幕上输出:“VIP会员”,C语言的写法为:

puts("VIP会员";

二进制写法为:
在这里插入图片描述
感受一下,直接使用二进制是不是受了很大伤害?

在计算机发展的初期,程序员就是使用这样的二进制来编写程序的,那个年代还没有编程语言。

直接使用二进制指令编程对程序员来说简直是噩梦,尤其是当程序员比较大的时候,不但编写麻烦,需要频繁查指令手册,而且除错会异常苦恼,要直接面对一维二进制数据,让人眼花缭乱。另外,用二进制指令编程步骤繁琐,要考虑各种边界情况和底层问题,开发效率十分低效。

这就有了后面开发出的编程语言,提高自己的生产力,例如汇编、C语言、C++、Java、Python、Go 、C#语言等,都是在逐步提高开发效率。至此,编程终于不再是只有极客能做的事了。

编译(Compile)

C语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是对于CPU,C语言代码就是天书,根本不认识,CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成.exe程序的格式,这个工具是一个特殊的软件———编译器(Compiler)。

编译也可以理解为“翻译”,类似于将中文翻译为英文、将英文翻译为象形文字,它是一个复杂的过程,大致包括词法分析语法分析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件架构。对于学计算机或者软件的大学生,“编译原理”是一门专业课程。

C语言的编译器有很多种,不同平台下有不同的编译器,例如:
.Windows下常用的是微软开发的Visual C++,它被集成在Visual Studio中,一般不单独使用;
.Linux下常用的是GUN组织开发的GCC,很多Linux发行版都自带GCC;
.Max下常用的是LLVM/Clang,它被集成在Xcode中(Xcode以前集成的是GCC,后来由于GCC的不配合才改为LLVM/Clang,LLVM/Clang的性能比GCC更加强大)。

编译器可以百分百保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,便于你的更改。

链接(Link)

C语言代码经过编译以后,并没有生成最终的可执行文件(.exe文件),而是生成一种叫做目标文件(Object File)的中间文件(或者说是临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的。对于Visual C++,目标文件的后缀是.obj;对于GCC,目标文件的后缀是.o。

目标文件经过链接(Link)以后才能变成可执行文件。既然目标文件和可执行文件的格式是一样的,为什么还要再链接一次呢,直接作为可执行文件不行吗?

当然不行!因为编译只是将我们写的代码变成了二进制形式,它还要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。

链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。

随着我们学习的深入,我们编写的代码越来越多,最终需要将它们分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件,这个时候,链接器除了将目标文件和系统组件组合起来,还要将编译器生成的多个目标文件组合起来。

再次强调,编译是针对一个源文件的,有多少源文件就要编译多少次,就要生成多少个目标文件。

总结

不管我们写多简单的代码,都必须经过【编译->链接】的过程才能生成可执行文件:

. 编译就是将我们编写的源代码“翻译”成计算机可识别的二进制格式,它们以目标文件的形式存在;
. 链接就是一个“打包”的过程,它将所有的目标文件以及系统组件合成一个可执行文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值