`
liubin2010
  • 浏览: 307328 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

编译与链接(转)

    博客分类:
  • c++
 
阅读更多
  在多道程序环境中,要想将一个用户源代码变成一个可以在内存中执行的程序,通常分为三个步骤:编译、链接、载入。

       (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文件。

总而言之,链接就是那些目标文件之间相互链接自己所需要的函数和全局变量,而函数可能来源于其他目标文件或库文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现,需要指定函数的Object File
分享到:
评论

相关推荐

    自己动手构造编译系统 编译 汇编与链接-高清版-2016年8月

    自己动手构造编译系统 编译 汇编与链接-高清版-2016年8月

    易语言静态编译链接器切换工具

    VC7="E:\【e语言编程】\[静态编译链接器大全]\VC7Linker\Bin\LINK.EXE"。VC8="E:\【E语言编程】\[静态编译链接器大全]\VC8Linker\Bin\LINK.EXE"。VC9="E:\【E语言编程】\[静态编译链接器大全]\VC9Linker\Bin\LINK....

    自己动手构造编译系统++编译、汇编与链接_14077184.pdf

    本书对编译器、汇编器、链接器、编译优化器涉及的关键算法、数据结构和程序实现流程,以及ELF文件的格式、Intel指令格式均作了详细的说明,并结合大量的图表,展示了编译系统工作过程中代码信息的流动和存储格式的...

    C++编译链接过程详解

    C++编译链接过程详解 C++是一门需要开发人员深入理解的语言,本文档将详细解释C++编译连接过程,对C++开发者很有帮助。 一、前言 长久以来,我一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器...

    IAR编译链接说明

    IAR编译链接说明主要涉及的是使用IAR Embedded Workbench进行嵌入式系统开发时的编译和链接流程,以及其中的关键概念LCF(Linker Control File)的介绍。IAR Embedded Workbench是一款广泛用于微控制器开发的专业...

    自己动手构造编译系统++编译、汇编与链接

    《自己动手构造编译系统++编译、汇编与链接》这本书深入浅出地介绍了编译器的基础知识,包括编译、汇编和链接这三个关键步骤。编译系统是计算机科学中的重要组成部分,它将高级语言转换为机器可执行的代码,使程序...

    反编译工具(DLL 转c/c++ 工具)

    标题中的“反编译工具(DLL 转 c/c++ 工具)”是指一类能够将动态链接库(DLL)文件转换为C或C++源代码的软件工具。DLL是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和资源。这种转换过程在...

    [易语言]静态编译链接器_VC98linker (静态编译必备)

    标题提到的"静态编译链接器_VC98linker"是专门针对易语言的一个辅助工具,用于解决在静态编译过程中遇到的链接问题。当我们在易语言中尝试进行静态编译时,可能会遇到“无法定位链接器”的错误,这通常是因为系统...

    Visual C++ 编译链接信息手册

    《Visual C++ 编译链接信息手册》是针对C++编程者的一份极其重要的参考资料,尤其对于在使用Visual C++开发环境中遇到编译和链接问题的开发者来说,它提供了宝贵的解决方案。手册涵盖了一系列关于编译器选项、链接器...

    VC++6.0工程创建 编辑 编译 链接 运行教程

    VC++6.0 工程创建、编辑、编译、链接、运行教程 本文档详细介绍了使用 VC++6.0 创建新工程的步骤,包括添加文件、编辑、编译、链接和运行等过程。该教程旨在帮助初学者快速掌握 VC++6.0 的使用方法。 一、VC++6.0 ...

    易语言 5.11 静态编译 VC6链接器

    其中的链接器(Linker)是编译过程的一部分,它的主要任务是将编译器产生的.obj文件(对象文件)与库文件合并,生成最终的可执行文件。在易语言中,虽然默认可能不直接支持VC6的链接器,但通过一些技巧,我们可以让...

    linux系统下的编译、链接、状态

    **动态链接与静态链接** 链接分为静态链接和动态链接。静态链接意味着所有的依赖项都被包含在最终的可执行文件中,这使得程序自包含但体积较大。动态链接则只包含程序自身的核心部分,依赖的库在运行时动态加载,...

    FluentUDF中文教程UDF第7章编译与链接[参照].pdf

    【Fluent UDF编译与链接教程】 在Fluent软件中,用户定义的函数(UDF)是扩展软件功能的关键工具。本教程专注于UDF的编译与链接过程,这通常涉及两个主要方面:解释UDF和编译UDF。 **7.1 介绍** UDF分为解释型和...

    RealView编译工具汇编指南-和工具链接器-打包.zip

    《RealView编译工具汇编指南》与《工具链接器》是针对RealView编译工具4.0版本的两份重要参考资料,它们为开发者提供了深入理解汇编语言编程和链接过程的关键信息。以下是对这两份文档主要内容的详细解读: 1. **...

    linux g++编译,链接助手

    linux下c++代码编译,链接,打动态库,执行助手 自动编译指定工程目录下的所有c++文件 ./ant.sh -init 在当前某个目录下初始化项目工程格式(创建src,bin,log,conf文件夹),项目名称是当前文件夹名称 ./ant.sh ...

    vs2015编译最新openssl-1.1.1 非命令行nmake 可轻松编译出动态链接库与静态链接库 包含完整项目配置文件 里面有详细项目说明 适合学习修改

    完整vs项目,包含项目完整配置... 如果是动态库会生成lib与dll两个文件,lib是编译链接时用,dll是运行时用,确保dll文件的名字与对应def文件中定义的dll文件名一致 内含openssl-1.1.1y源码,已配置好,下载即可编译

    易语言静态编译 链接器切换修复工具.exe

    易语言静态编译 链接器切换修复工具

    从hello world 谈编译链接与装载

    1.程序为什么要被编译了之后才可以运行,编译器在其中又做了些什么? 2.helloworld编译出来的文件里面都是什么?程序的入口函数一定是main函数吗? 3.hellowolrd程序在运行是在内存中是怎么分布的?

Global site tag (gtag.js) - Google Analytics