发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
编译和链接的区别
在多道程序环境中,要想将一个用户源代码变成一个可以在内存中执行的程序,通常分为三个步骤:编译、链接、载入。
(1)编译:由编译程序将用户的源代码编译成若干个目标模块。
(2)链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模块。
(3)载入:由载入程序将载入模块载入内存。
编译和链接都是为将用户程序从硬盘上调入内存并将其转换为可执行程序服务的。用编译器时的compile就是在进行编译,link就是链接,运行程序时可以看到。
编译可以理解为高级语言翻译为计算机可以理解的二进制代码,即机器语言。
链接可以举例解释:一个程序编译后,在作业地址空间中所得到目标模块的起始地址通常是0,假设在1000处有一条指令load 1, 2500,即将2500单元处的数据取至寄存器1中。在多道程序环境下,将程序载入内存时并不可能预先知道所编译的模块应该放在内存的何处。假设程序被载入从10000开始的地址,此时的2500就应该变成了12500,这里就出现问题了,需要修改指令中的相对地址,但此时如果采用动态链接就可以不用修改地址,灵活地解决这个问题了。
链接分三种:静态链接、载入时动态链接、运行时动态链接,现在流行的是运行时动态链接,这种不仅可以回忆程序的载入过程,而且节省了大量的内存空间。
再来看C/C++的编译和链接:
无论是C/C++,首先要把源文件编译成中间代码文件,在Windows下面就是.obj文件,Unix、Linux下面就是.o文件,即Object File,这个动作叫编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(.o文件或是.obj文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(.o文件或是.obj文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是.a文件。
总而言之,链接就是那些目标文件之间相互链接自己所需要的函数和全局变量,而函数可能来源于其他目标文件或库文件。
来自: champion_xu > 《Programming》
0条评论
发表
请遵守用户 评论公约
交叉编译
源代码经过编译后,并没有生成最终的可执行文件,而是生成一种被称为目标文件(Object File)的中间文件。所谓"本地编译",是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台。比...
C语言的编译与链接
C语言源文件要经过编译、链接才能生成可执行程序:编译(Compile)会将源文件(.c文件)转换为目标文件。编译是针对单个源文件的,一次编译操作只能编译一个源文件,如果程序中有多个源文件,就需要多...
编写第一个C语言程序
其实,C程序的入口是一个名字叫做main的函数,简称main函数。为了保证第5行代码的正常使用,就在main函数的前面加了一行代码#include ,...
乐创DIY C语言讲义——2.2节
C语言的源文件,包括.c文件和.h文件两种,一般地,我们把实现功能的函数,流程代码放在.c文件中,将一些变量的声明,类型定义的代码放在...
C与C 混合编程
2. 被调用C++代码中的源文件(callee.cpp)在callee.h中,把函数 cpp_hello 放在 extern ''''''''C'...
c语言程序的编译过程
c语言程序的编译过程。在Unix/Linux系统上,从源文件到目标文件的转化是由编译器驱动程序完成的: linux> gcc –o hello hello.c 在这里,gcc编译器驱动程序读取源程序文件hello.c,...
再理解编译链接过程(GCC编译器)
再理解编译链接过程(GCC编译器) \ 再理解编译链接过程(GCC编译器) 2015-11-10 16:43阅读: 下午一觉睡到了4点,起来干了一件...
C/C++程序编译流程详解
经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程...
计算机大佬让你彻底了解深入理解计算机系统
目标文件定义和引用符号,一个个符号对应一个函数或一个全局变量或一个静态变量(即C语言中以static属性声明的变量)。编译器和汇编器生...
微信扫码,在手机上查看选中内容