C:目标代码文件、 可执行文件和库

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

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

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

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/wbyixx/p/12238586.html

时间: 2024-08-02 12:35:02

C:目标代码文件、 可执行文件和库的相关文章

目标代码文件、可执行文件和库

C程序的执行过程可分为:编辑.编译.连接.运行. 将程序源代码转换为可执行文件,需要编译与连接这两个步骤.编译器将源代码转换为中间代码,然后链接器将此中间代码与其他代码结合起来,生成可执行文件.同时,链接器将你的程序与预编译的库代码结合起来. 目标代码文件所缺少的第一个元素是一种叫启动代码的东西(start-up code),此代码相当于你的程序与操作系统之间的接口. 缺少的第二个东西是库例程的代码,也称为函数. 而链接器的作用就是将目标代码.启动代码和库代码结合在一起,并放在单个文件里,这个文

C基础——目标代码文件、可执行文件和库

目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代码与其他代码相结合来生成可执行文件.C使用被划分为两部分的这一方法使程序便于模块化.我们可以分别编译各个模块,然后使用链接器将编译过的模块结合起来.这样,如果需要改变一个模块,则不必重新编译所有其他模块.同时,链接器将自己的程序与预编译的库代码结合起来. 中间文件的形式有多种选择.最一般的选这,同时

C语言开发过程中目标代码文件、可执行文件和库

一.C程序开发的一般流程 1:定义程序的目标,明确程序的功能,明确程序中需要哪些信息.计算和控制,明确程序中应该报告什么信息,不会设计到具体的计算机语言,对于问题的描述一般用的是术语: 2:设计程序,考虑如何通过程序实现程序的目标,具体一点说,需要考虑的可以有用户界面的设计.程序的组织.目标用户的确定以及程序开发时间计划,除了这些,好需要确定是在程序中(也有可能是在辅助文件中)数据的表示形式以及数据的处理方法.这个阶段,不会用到具体的代码.问题的描述用的是一般术语,但是不排除某些决策会和具体的语

001-目标代码文件、可执行文件和库

C编程的基本策略是使用程序将源代码文件转换为可执行文件.C分两步完成这一工作:编译和链接. 编译器将源代码转换为中间代码,链接器将此中间代码与其他代码结合起来生成可执行文件. 中间文件的形式有多选择.最一般的选择是将源代码转换为机器语言代码,将其结果放置在一个目标代码文件中. 目标代码文件缺少的元素:启动代码:库例程代码 链结器的作用是将目标代码,系统的标准启动代码和库代码结合在一起,形成可执行文件.

从代码到可执行文件

该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78423 gemfield本文可能对你的编码能力不会产生影响,也可能对提高你的社会地位起不到任何帮助,但世界上总有一些事务是为改变你的世界观而诞生的——就像gemfield本文<从代码到可执行文件> . 正如题目所说的那样,我们得先从一段程序代码开始——gemfield.c. 又正如程序的名字所说的,这是个c语言文件,极其简单. **************************** in

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD

linux下动态链接库.so文件 静态链接库.a文件创建及使用

转摘网址为:http://www.cnblogs.com/fengyv/archive/2012/08/10/2631313.html Linux下文件的类型是不依赖于其后缀名的,但一般来讲:    .o,是目标文件,相当于windows中的.obj文件    .so 为共享库,是shared object,用于动态连接的,和dll差不多    .a为静态库,是好多个.o合在一起,用于静态连接    .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息.可以用如下命令

Golang使用pkg-config自动获取头文件和链接库的方法

为了能够重用已有的C语言库,我们在使用Golang开发项目或系统的时候难免会遇到Go和C语言混合编程,这时很多人都会选择使用cgo. 话说cgo这个东西可算得上是让人又爱又恨,好处在于它可以让你快速重用已有的C语言库,无需再用Golang重造一遍轮子,而坏处就在于它会在一定程度 上削弱你的系统性能.关于cgo的种种劣迹,Dave Cheney大神在他的博客上有一篇专门的文章<cgo is not Go>,感兴趣的同学可以看一看.但话说回来,有时候为了快速开发满足项目需求,使用cgo也实在是不得

如何用CSC.exe来编译Visual C#的代码文件

原文:如何用CSC.exe来编译Visual C#的代码文件 C#的编译过程? ? ? 如何用CSC.exe来编译Visual C#的代码文件 ? Csc.exe 编译器的位置路径:C:\Windows\Microsoft.NET\Framework64\v4.0.30319 如何编译: 1.为了使用方便,你可以手动把上面的目录添加到Path环境变量中去 2.用Csc.exe编译HelloWorld.cs非常简单,打开命令提示符,并切换到存放 HelloWorld.cs文件的目录中,输入下列行命