C编程的基本策略是, 用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。

典型的C实现通过编译和链接两个步骤来完成这一过程。

编译器把源代码转换成中间代码, 链接器把中间代码和其他代码合并, 生成可执行文件。

C 使用这种分而治之的方法方便对程序进行模块化, 可以独立编译单独的模块, 稍后再用链接器合并已编译的模块。

通过这种方式, 如果只更改某个模块, 不必因此重新编译其他模块。

另外, 链接器还将你编写的程序和预编译的库代码合并。

中间文件有多种形式。 我们在这里描述的是最普遍的一种形式, 即把源代码转换为机器语言代码, 并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件) 。 虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。 因为目标文件中储存的是编译器翻译的源代码, 这还不是一个完整的程序。

目标代码文件缺失启动代码(startup code) 。 启动代码充当着程序和操作系统之间的接口。 例如, 可以在MS Windows或Linux系统下运行IBM PC兼容机。 这两种情况所使用的硬件相同, 所以目标代码相同, 但是Windows和Linux所需的启动代码不同, 因为这些系统处理程序的方式不同。

目标代码还缺少库函数。 几乎所有的C程序都要使用C标准库中的函数。 例如, concrete.c中就使用了 printf()函数。 目标代码文件并不包含该函数的代码, 它只包含了使用 printf()函数的指令。 printf()函数真正的代码储存在另一个被称为库的文件中。 库文件中有许多函数的目标代码。

链接器的作用是, 把你编写的目标代码、 系统的标准启动代码和库代码这 3 部分合并成一个文件, 即可执行文件。 对于库代码, 链接器只会把程序中要用到的库函数代码提取出来(见图1.4) 。

简而言之, 目标文件和可执行文件都由机器语言指令组成的。 然而, 目标文件中只包含编译器为你编写的代码翻译的机器语言代码, 可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。

在有些系统中, 必须分别运行编译程序和链接程序, 而在另一些系统中, 编译器会自动启动链接器, 用户只需给出编译命令即可。

C:编译过程、目标代码文件、 可执行文件和库的更多相关文章

  1. Python语言、编译解释、动态库静态库、编译过程、头文件

    学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...

  2. C语言编译过程及相关文件

    1,C程序编译步骤 C代码编译成可执行程序经过4步: 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3 ...

  3. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  4. MDK 的编译过程及文件类型全解

    MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是很有帮助的,在有arm9开发的基础上,下 ...

  5. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  6. 第48章 MDK的编译过程及文件类型全解

    Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...

  7. C编译过程概述

    转自:http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection), ...

  8. [转贴]C编译过程概述

    http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是G ...

  9. GCC编译器原理(三)------编译原理三:编译过程---预处理

    Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello. ...

随机推荐

  1. mysql(5):主从复制和分库分表

    主从复制集群 概念:主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点. 使用场景: 读写分离:使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读 ...

  2. html 未选择复选框不上传

    问题 之前就遇到类似的问题,在一个列表中,如果有复选框,并且不选中 会导致这个复选框不上传,导致后台接收不到复选框数据 解决方法我想到的就是 <td> <input type=&qu ...

  3. linux软件下载

    可以到linux官网下载:http://vault.centos.org/6.10/os/Source/SPackages/

  4. Iris_cookie和session

    3. Session的使用和控制 在实际的项目开发中,我们会经常有业务场景使用到Session功能.在iris框架中,也为我们提供了方便使用,功能齐全的Session模块.Session模块的源码目录 ...

  5. angular 读写电脑本地文件

    angular 读写本地电脑文件 angular将数据写进到电脑文件 在前端写一个按钮,然后点击按钮的时候在本地电脑保存一个text文件. 这时候我们需要用到一个angular的插件,叫做" ...

  6. LED Magic Light - How Does The LED Light Change Color?

    The    LED Magic Light    states that the color-changing LED is not an LED in the package, but three ...

  7. MySQL 的两种存储引擎

    MyISAM 是MySQL的默认数据库引擎(5.5以后默认是InnoDB)性能极佳,但不支持事务处理. InnoDB 是MySQL的数据库常用的数据引擎. MyISAM 和 InnoDB 两者之间有明 ...

  8. 445. 两数相加 II

    Q: A: 这种题的用例是一定会搞一些很大的数的.long都会溢出,所以我们就不用尝试转数字做加法转链表的方法了.另外直接倒置两个链表再做加法的做法会改变原链表,题干也说了禁止改动原链表. 1.求两个 ...

  9. Vue学习 Day01

    介绍 这个系列记录自己学习Vue的过程. Vue官方不推荐新手直接使用 vue-cli,所以前面这几天都是根据官方文档学习. 步骤 新建一个html文件. 在html中导入vue.js依赖. < ...

  10. 题解 P1717 【钓鱼】

    P1717 钓鱼 贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq #include<cstdio> using namespac ...