C:编译过程、目标代码文件、 可执行文件和库
C编程的基本策略是, 用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。
典型的C实现通过编译和链接两个步骤来完成这一过程。
编译器把源代码转换成中间代码, 链接器把中间代码和其他代码合并, 生成可执行文件。
C 使用这种分而治之的方法方便对程序进行模块化, 可以独立编译单独的模块, 稍后再用链接器合并已编译的模块。
通过这种方式, 如果只更改某个模块, 不必因此重新编译其他模块。
另外, 链接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。 我们在这里描述的是最普遍的一种形式, 即把源代码转换为机器语言代码, 并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件) 。 虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。 因为目标文件中储存的是编译器翻译的源代码, 这还不是一个完整的程序。
目标代码文件缺失启动代码(startup code) 。 启动代码充当着程序和操作系统之间的接口。 例如, 可以在MS Windows或Linux系统下运行IBM PC兼容机。 这两种情况所使用的硬件相同, 所以目标代码相同, 但是Windows和Linux所需的启动代码不同, 因为这些系统处理程序的方式不同。
目标代码还缺少库函数。 几乎所有的C程序都要使用C标准库中的函数。 例如, concrete.c中就使用了 printf()函数。 目标代码文件并不包含该函数的代码, 它只包含了使用 printf()函数的指令。 printf()函数真正的代码储存在另一个被称为库的文件中。 库文件中有许多函数的目标代码。
链接器的作用是, 把你编写的目标代码、 系统的标准启动代码和库代码这 3 部分合并成一个文件, 即可执行文件。 对于库代码, 链接器只会把程序中要用到的库函数代码提取出来(见图1.4) 。

简而言之, 目标文件和可执行文件都由机器语言指令组成的。 然而, 目标文件中只包含编译器为你编写的代码翻译的机器语言代码, 可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
在有些系统中, 必须分别运行编译程序和链接程序, 而在另一些系统中, 编译器会自动启动链接器, 用户只需给出编译命令即可。

C:编译过程、目标代码文件、 可执行文件和库的更多相关文章
- Python语言、编译解释、动态库静态库、编译过程、头文件
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
- C语言编译过程及相关文件
1,C程序编译步骤 C代码编译成可执行程序经过4步: 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3 ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- MDK 的编译过程及文件类型全解
MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是很有帮助的,在有arm9开发的基础上,下 ...
- 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列
第48章 MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- 第48章 MDK的编译过程及文件类型全解
Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...
- C编译过程概述
转自:http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection), ...
- [转贴]C编译过程概述
http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是G ...
- GCC编译器原理(三)------编译原理三:编译过程---预处理
Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello. ...
随机推荐
- ubuntu18.04双卡机安装ubidia驱动遇到的坑
在ubuntu 18的软件更新中选择英伟达驱动进行安装,输入nvidia-smi总是提示缺少驱动,未驱动之类的报错. 何解? 最初以为安装系统的问题,重装ubuntu也未果. 最后查了很多资料,找到一 ...
- webpack4.41.0配置二(加载器_url-loader/babel-loader/sass-loader)
loader是webpack用来预处理源文件的,比如typesrcipt形式的文件最终都得转成浏览器可以执行的js文件 (注:以下的配置代码不一定与下方一摸一样,具体与官网上https://webpa ...
- resize2fs: 报错
报错如下 [root@localhost ~]# resize2fs /dev/mapper/centos-root resize2fs (-Dec-) resize2fs: Bad magic nu ...
- Hibernate:HIbernate配置详解-HelloWorld
hibernate介绍: Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 它不仅提供了从java类到数 ...
- sqlldr总结参数介绍
有效的关键字: userid -- ORACLE username/password control - 控制文件 log - 记录的日志文件 * 表示 ...
- PHP 超全局变量之$GLOBALS
$GLOBALS——引用全局作用域中可用的全部变量. $GLOBALS一个包含了全部变量的全局组合数组.变量的名字就是数组的键.(即所有出现过的全局变量,都可通过$GLOBALS获取到) 注释: “S ...
- docker 初识1
学习网址 https://git.oschina.net/yangllsdev/docker-training https://docs.docker.com/engine/installation/ ...
- 计算几何-poj2451-HPI
This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. 题意,求半平面交 ...
- Swagger与OAuth 手动搭建WebApi 操作笔记
1.创建一个空的Web应用程序 2.通过nuget 安装以下插件清单,有部分会在安装其他插件时候自动安装: 3.安装完Swagger 会生成一个目录App_Start,在这个目录中增加文件ApiCon ...
- centos平台搭建Oracle11g数据库+远程连接
经过了几天的摸爬滚打,终于成功的能在宿主机上(window10上的Plsql)去成功的连上虚拟机上的centos数据库 下面将自己的经验分享给大家: 具体的centos7.centos6上安装Orac ...