编译和链接的区别 编译与链接的区别

  编译和链接都是为将用户程序从硬盘上调入内存并将其转换为可执行程序服务的。用编译器时的compile就是在进行编译,link就是链接,它们两者之间还有什么区别呢?下面,爱华网小编带你去看一看。

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

  一、含义

  (1)编译:由编译程序将用户的源代码编译成若干个目标模块。

  (2)链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模块。

  (3)载入:由载入程序将载入模块载入内存

  二、分类

  链接分三种:静态链接、载入时动态链接、运行时动态链接,现在流行的是运行时动态链接,这种不仅可以回忆程序的载入过程,而且节省了大量的内存空间。

  三、编译和链接的区别

  无论是C/C++,首先要把源文件编译成中间代码文件,在Windows下面就是.obj文件,Unix、Linux下面就是.o文件,即Object File,这个动作叫编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

  编译时,编译器需要的是语法的正确,函数与变量的声明的正确。一般来说,每个源文件都应该对应于一个中间目标文件(.o文件或是.obj文件)。

  链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(.o文件或是.obj文件)来链接我们的应用程序。链接就是那些目标文件之间相互链接自己所需要的函数和全局变量,而函数可能来源于其他目标文件或库文件。

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

  小编提示

  编译的时候采用 -Lxxx -lyyy 的形式使用库,-L和-l这个参数并没有配对的关系,我们的一些Makefile 为了维护方便把他们写成配对的形式,造成了误解.其实完全可以写成 -Lpath1, -Lpath2, -Lpath3, -llib1 这样的形式。

编译和链接的区别 编译与链接的区别

  在具体链接的时候,gcc是以.o文件为单位, 编译的时候如果写 g++ -o main main.cpp libx.o 那么无论main.cpp中是否使用到libx.o,libx.o中的所有符号都会被载入到mian函数中.但是如果是针对.a,写成g++ -o main main.cpp -L./ -lx, 这个时候gcc在链接的时候只会链接有被用到.o, 如果出现libx.a中的某个.o文件中没有任何一个符号被main用到,那么这个.o就不会被链接到main中重定位。

  经过上面的符号解析后,所有的符号都可以找到它所对应的实际位置(U表示的链接找到具体的符号位置).

  as 汇编生成一个目标模块的时候,它不知道数据和代码在最后具体的位置,同时也不知道任何外部定义的符号的具体位置,所以as在生成目标代码的时候,对于位置未知的符号,它会生成一个重定位表目,告诉链接器在将目标文件合并成可执行文件时候如何修改地址成最终的位置。

  采用gcc 和g++ 在编译的时候产生的符号有所不同。

  在C++中由于要支持函数重载,命名空间等特性,g++会把函数+参数(可能还有命名空间),把函数命变成一个特殊并且唯一的符号名.例如:int foo(int a);

  在gcc编译后,在符号表中的名字就是函数名foo, 但是在g++编译后名字可能就变成了_Z3fooi, 我们可以使用 c++filt命令把一个符号还原成它原本的样子。

  

爱华网本文地址 » http://www.aihuau.com/a/2280871/253927639.html

更多阅读

玛瑙与玉髓的区别 红玉髓和红玛瑙的区别

玛瑙与玉髓的区别——简介玉髓被称为玛瑙的姐妹玉石,相信很少人知道这一点。而我们在挑选这么玛瑙和玉髓制成的饰品的时候,该如何去区分我们看到的到底是玉髓还是玛瑙呢?下面,来介绍一下玉髓和玛瑙的区别,以便消费者朋友们更容易区分。

苹果5s和苹果5的区别 苹果5与5s的区别在哪里

苹果5s和苹果5的区别——简介苹果在2013年发布了新款 iPhone 5s 手机,与以往一样 苹果5s 与 苹果5在外面上基本上没有什么变化,只是内在的硬件性能提升。可能很多喜欢苹果手机的用户,在购买时可能会在这二款手机上难以抉择。下面就二款

DVD-ROM和DVD-RAM的区别? rom与ram的区别

ROM和RAM指的都是半导体存储器。本来的含义是:ROM是Read OnlyMemory的意思,也就是说这种存储器只能读,不能写。而RAM是Random AccessMemory的缩写。这个词的由来是因为早期的计算机曾经使用磁鼓作为内存,而磁鼓和磁带都是典型的顺序读写

银联卡和visa卡的区别 VISA与银联的畸恋

  发函要求自家会员银行,从今年8月1日起,凡在中国大陆境外受理VISA和银联的双币卡时,无论是刷卡消费还是ATM取现,都不得走中国银联的清算通道,否则VISA将重罚收单银行,第一次罚款5万美元,第二次再犯,每月罚款2.5万美元。      董峥研

声明:《编译和链接的区别 编译与链接的区别》为网友会回来德分享!如侵犯到您的合法权益请联系我们删除