DLL和LIB文件 - 什么,为什么?DLL和LIB文件 - 什么,为什么?(DLL and LIB

2019-05-12 14:26发布

我知道很少的DLL和LIB的以外,它们包含了程序正常运行所需的关键代码 - 库。 但为什么编译器生成它们呢? 那岂不是更容易只包含一个可执行所有的代码? 什么是DLL的和LIB的区别?

Answer 1:

有静态库(LIB)和动态连接库(DLL)。

图书馆的使用,因为你可能要在许多程序中使用的代码。 例如,如果你写计数字符串中的字符数的函数,该函数将在很多程序非常有用。 一旦你得到那个功能工作正常,你不想在每次使用它的时间来重新编译代码,所以你把可执行代码的库函数,链接器可以提取和编译代码插入到你的程序。 静态库有时被称为“档案”这个原因。

动态库借此一步。 这似乎浪费有占用空间在每个程序的库函数的多个副本。 为什么他们不能的功能都有一个副本? 这是动态库是。 而不是建立在库的代码到你的程序时,它被编译,它可以通过它加载到内存中它映射到你的程序运行。 在同一时间运行使用相同功能的多个程序都可以共享一个拷贝,节省内存。 事实上,你可以加载动态链接库仅在需要时,通过不同的代码路径上。 在具有占用内存,如果你没有做任何打印的打印机程序没有任何意义。 在另一方面,这意味着你必须安装有每台机器上的动态库的副本,你的程序运行上。 这将创建其自己的一套问题。

举个例子,几乎每一个程序写在“C”将需要的功能从一个叫做“C运行时库库,虽然一些程序将所有需要的功能。 C运行时同时具有静态和动态的版本,这样你就可以决定你的程序使用取决于特定需要哪个版本。



Answer 2:

另一个方面是安全(模糊处理)。 一旦一段代码被从主应用程序中提取,放在一个“分离”动态链接库,很容易攻击,分析(逆向工程)的代码,因为它已被隔离。 当相同的一段代码被保持在LIB库,它是编译(链接的)目标应用程序的一部分,并且这因此难以从目标的二进制文件的其余部分隔离(区分),该一段代码。



Answer 3:

创建DLL / LIB而不仅仅是编译代码成可执行的一个重要原因是重用和重新定位。 平均Java或.NET应用程序(例如)将最有可能使用一些第三方(或框架)库。 这是很容易和更快地只是针对编译预建图书馆,而不是所有的第三方代码编译到应用程序中。 编译你的代码库还鼓励良好的设计实践,例如设计你的类在不同类型的应用中使用。



Answer 4:

DLL是的那些其他可执行程序之间共享的函数库。 只要看看在你的windows / system32目录下,你会发现几十人。 当你的程序创建一个DLL它也通常会创建一个lib文件,使应用程序的* .exe程序可以解决都在DLL中定义的符号。

一的.lib是静态链接到一个程序的函数库 - 他们不被其他程序共享。 每个带*的.lib文件链接程序在该文件中的所有代码。 如果你有两个方案A.exe时和B.EXE与C.lib然后链接各个A和B都将包含在C.lib代码。

你如何创建DLL和库取决于您使用的编译器。 每个编译器不同的看法。



Answer 5:

另外一个不同之处在于性能。

由于DLL由.EXE(多个)在运行时加载,该.exe(S)和具有共享存储器概念的DLL工作,因此性能低相对于静态链接。

在另一方面,一的.lib是在编译时静态链接到每一个请求过程的代码。 因此,.EXE(一个或多个)将具有单个存储器,从而提高了该方法的性能。



文章来源: DLL and LIB files - what and why?