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

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

http://wiki.ubuntu.com.cn/跟我一起写Makefile:MakeFile介绍#makefile.E7.9A.84.E8.A7.84.E5.88.99

编译和链接的区别、makefile怎么写相关推荐

  1. iOS——编译与链接

    前言 计算机语言分为机器语言.汇编语言和高级语言. 可以将高级语言分为两种:1,编译语言和解释型语言(直译式语言). 解释型语言(逐步进行解释执行) 解释语言编写的程序在每次运行时都需要通过解释器对程 ...

  2. 用 powershell 脚本 .ps1 写一个自动化的「编译->链接->运行C++文件」脚本

    │ abc.cpp │ main.cpp │ test.ps1 │ └─.vscodec_cpp_properties.jsonsettings.json 我这人有个毛病:一定要用 VS Code 写 ...

  3. 编译有哪些阶段,动态链接和静态链接的区别 c++

    预处理-->编译-->汇编-->链接 预处理:编译器将C程序的头文件编译进来,还有宏的替换 编译:这个阶段编译器主要做词法分析.语法分析.语义分析等,在检查无错误后后,把代码翻译成汇 ...

  4. 定义指令时“控制器”,“链接”和“编译”函数之间的区别

    本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...

  5. Makefile 编译与链接选项及CFLAGS与LDFLAGS说明

    CFLAGS与LDFLAGS的说明,他们都是是隐含规则的变量,且是一种命令参数变量. makefile内嵌隐含规则的命令中,所使用的变量都是预定义的变量.我们将这些变量称为"隐含变量&quo ...

  6. 高级语言的编译:链接及装载过程介绍

    引言 随着越来越多功能强大的高级语言的出现,在服务器计算能力不是瓶颈的条件下,很多同学会选择开发效率高,功能强大的虚拟机支持的高级语言(Java),或者脚本语言(Python,Php)作为实现功能的首 ...

  7. linux下编译动态和静态链接库

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在. 查看当前工程目录的内容 ...

  8. linux 生成和使用动态链接库和静态链接库的Makefile编写

    引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...

  9. spdlog linux编译出错,Linux下编写Makefile引入第三方库

    Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...

最新文章

  1. T-SQL IN 谓词
  2. recycleView 滑动删除Item,拖拽切换Item,你想了解的都在这儿
  3. python为什么用号做注释符_Python为什么用#号作注释符?
  4. python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式
  5. Cygwin编译自己定义OpenCV库报错:opencv_contrib: LOCAL_SRC_FILES points to a missing file
  6. 叫板苹果谷歌,微软将开发者应用分成上调至 95%
  7. 转载:东拉西扯:产业链
  8. ASP.NET MVC 企业级实战 —— 创建用户权限管理范例程序(三)
  9. 互联网秒杀业务架构设计
  10. ENVI5.3 辐射校正相关操作
  11. linux安装中文输入法 -谷歌拼音
  12. 工业机器人常用编程语言有哪些
  13. Monte Carlo Algorithms
  14. cesium绘制网格_Cesium (五) 栅格图层
  15. shiro原理_java:shiro高级篇——4
  16. 解决IE下input事件初始化自动执行的问题
  17. 第一次学游泳技巧_第一次学游泳作文8篇
  18. JVM知识点精华汇总 侵立删
  19. 红旗linux如何开远程桌面,配置VNC服务实现红旗Linux远程桌面访问
  20. 论文阅读——Multi-Scale Image Contextual Attention Learning for Inpainting

热门文章

  1. Nginx的HTTP运行时健康检查
  2. TCP UDP的区别
  3. 20以内的素数编码C语言,用C语言 输出100以内的素数,
  4. linux创建脚本文件auto,linux 自动化部署脚本
  5. 亲测使用 swagger 动态修改后台默认访问地址 swagger-ui.html
  6. js designMode contentEditable 编辑在线网页
  7. C#算法设计排序篇之10-桶排序(附带动画演示程序)
  8. docker host and docker container
  9. 手动创建线程更好哦_如何通过创建更好的工作流程找到下一个大想法
  10. des加密的c语言程序,C++中四种加密算法之DES源代码