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之路练习题

    题目换成求平均薪水的等级最高的部门的部门名称

  2. java项目中的异常处理总结

    异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要. 比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常. 我找一个比较形象 ...

  3. HttpRunner接口自动化框架的使用

    简介: HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. HttpRu ...

  4. Java + Selenium 无头浏览器模式

    我们说的无头模式,只是在爬虫执行的时候,不再弹出浏览器的界面,只是使用浏览器的内核进行爬取,下面是示例代码: //设置本地chromedriver地址 System.setProperty(" ...

  5. NOIP做题练习(day5)

    A - 中位数图 题面 题解 先找出题意中的\(b\)所在的位置. 再以这个位置为中心,向右\(for\)一遍有多少个大于/小于该数的数 大于就\(++cs\) 小于就\(--cs\). 因为这个数是 ...

  6. HTML学习(5)标题、水平线、注释

    HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题. <h6> 定义最小的标题. 注: 浏 ...

  7. dbGet

    dbGet是Innovus/Encounter DBTCL命令的一种.除了dbGet,DBTCL的命令还包括以下几种: 1. dbSet 2. setDbGetMode/getDbGetMode 3. ...

  8. Hadoop2.0之YARN组件

    官方文档:https://hadoop.apache.org/docs/stable/,目前官方已经是3.x,但yarn机制没有太大变化 一.简介 在Hadoop1.0中,没有yarn,所有的任务调度 ...

  9. 牛客腾讯2020校园招聘-后台&综合-第一次笔试

    第一题 Q: 小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串 ...

  10. (BFS)1097: Yuchang and Zixiang ‘s maze

    1097: Yuchang and Zixiang ‘s maze Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 863 Solved: 149   De ...