我对 DLL 和 LIB 知之甚少,只知道它们包含程序正常运行所需的重要代码 - 库。但为什么编译器要生成它们呢?将所有代码包含在一个可执行文件中不是更容易吗?DLL 和 LIB 之间有什么区别?

有帮助吗?

解决方案

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

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

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

作为一个例子,几乎每一个程序写在“C”将需要从库函数称为“C运行时库,虽然很少的程序将需要的所有的功能。 C运行时同时具有静态和动态的版本,这样你就可以决定哪个版本的程序根据具体的需求使用。

其他提示

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

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

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

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

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

另一个区别在于性能。

由于 DLL 在运行时由 .exe 加载,因此 .exe 和 DLL 使用共享内存概念,因此相对于静态链接性能较低。

另一方面,.lib 是在编译时静态链接到每个请求的进程中的代码。因此,.exe 将具有单一内存,从而提高进程的性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top