DLL和LIB文件 – 什么和为什么?
我对DLL和LIB知之甚less,除了它们包含程序正常运行所需的重要代码 – 库。 但为什么编译器生成它们呢? 把所有的代码包含在单个可执行文件中是不是更容易? DLL和LIB有什么区别?
有静态库(LIB)和dynamic库(DLL)。
图书馆的使用,因为你可能有你想在许多程序中使用的代码。 例如,如果您编写一个函数来计算string中的字符数,那么该函数将在很多程序中有用。 一旦你得到这个函数正常工作,你不想每次使用时都要重新编译代码,所以你把这个函数的可执行代码放在一个库里,链接器可以提取编译后的代码并将其插入到你的程序中。 静态库有时也被称为“档案”。
dynamic库更进一步。 有多个库函数副本占用每个程序的空间似乎是浪费的。 为什么他们不能共享一个函数副本? 这是dynamic库的用途。 编译时,不需要将程序库代码编译到程序中,它可以在程序加载到内存中时映射到程序中运行。 同时运行的多个程序使用相同的function,可以共享一个副本,节省内存。 实际上,只能根据需要加载dynamic库,具体取决于代码的path。 如果您没有进行任何打印,则无需让打印机例程占用内存。 另一方面,这意味着您必须在运行程序的每台计算机上安装dynamic库的副本。 这造成了自己的一系列问题。
举个例子,几乎所有用'C'编写的程序都需要一个名为'C运行时库'的函数库,尽pipe很less的程序需要所有的函数。 C运行时带有静态和dynamic两种版本,因此您可以根据特定需求确定程序使用哪个版本。
另一个方面是安全(混淆)。 一旦从主应用程序中提取了一段代码并将其放入“分离的”dynamic链接库中,由于该代码已被隔离,所以更容易攻击,分析(反向工程)代码。 当同一段代码保存在LIB库中时,它是已编译(链接的)目标应用程序的一部分,因此难以从其他目标二进制文件中分离(区分)该代码段。
创buildDLL / LIB而不是将代码编译为可执行文件的一个重要原因是重用和重定位。 一般的Java或.NET应用程序(例如)很可能会使用多个第三方(或框架)库。 只需编译预构build的库,而不必将所有第三方代码编译到应用程序中,这样更容易,更快速。 把你的代码编译成库也鼓励好的devise实践,例如devise你的类用于不同types的应用程序。
DLL是在其他可执行程序之间共享的函数库。 只要看看你的Windows / system32目录,你会发现几十个。 当您的程序创build一个DLL时,它通常也会创build一个lib文件,以便应用程序* .exe程序可以parsing在DLL中声明的符号。
.lib是一个静态链接到程序的函数库 – 它们不被其他程序共享。 每个与* .lib文件链接的程序都具有该文件中的所有代码。 如果您有两个程序A.exe和B.exe与C.lib链接,那么每个A和B都将包含C.lib中的代码。
如何创buildDLL和库取决于您使用的编译器。 每个编译器都有不同的做法
另一个区别在于表演。
由于DLL在运行时被.exe(s)加载,所以.exe(s)和DLL与共享内存的概念一起工作,因此相对于静态链接来说性能较低。
另一方面,.lib是在编译时静态链接到请求的每个进程的代码。 因此.exe(s)将具有单个内存,从而提高了进程的性能。