我对DLL和LIB所知甚少,只知道它们包含程序正常运行所需的重要代码——库。但是为什么编译器要生成它们呢?将所有代码都包含在一个可执行文件中不是更容易吗?DLL和LIB之间的区别是什么?
创建DLL/LIB而不是将代码编译成可执行文件的一个重要原因是重用和重定位。一般的Java或. net应用程序(例如)很可能会使用几个第三方(或框架)库。根据预构建的库进行编译要容易得多,速度也快得多,而不必将所有第三方代码编译到应用程序中。将代码编译到库中也鼓励良好的设计实践,例如,将类设计为用于不同类型的应用程序。
有静态库(LIB)和动态库(DLL) -但请注意.LIB文件可以是静态库(包含目标文件)或导入库(包含允许链接器链接到DLL的符号)。
使用库是因为您可能有想要在许多程序中使用的代码。例如,如果你写了一个计算字符串中字符数的函数,这个函数在很多程序中都很有用。一旦函数正常工作,您就不希望每次使用它时都必须重新编译代码,因此您可以将该函数的可执行代码放在库中,链接器可以提取已编译的代码并将其插入到程序中。因此,静态库有时被称为“档案”。
动态库更进一步。让多个库函数副本在每个程序中占用空间似乎是一种浪费。为什么它们不能共享函数的一个副本?这就是动态库的用途。与其在编译程序时将库代码构建到程序中,不如在将库代码加载到内存时将其映射到程序中来运行。同时运行的使用相同函数的多个程序可以共享一个副本,从而节省内存。事实上,您可以只在需要时加载动态库,这取决于代码的路径。如果不进行任何打印,让打印机例程占用内存是没有意义的。另一方面,这意味着在运行程序的每台机器上都必须安装动态库的副本。这就产生了一系列问题。
例如,几乎每个用“C”编写的程序都需要来自“C运行时库”的函数,尽管很少有程序需要所有这些函数。C运行时有静态和动态两种版本,因此您可以根据特定的需要确定程序使用哪个版本。
另一个方面是安全性(混淆)。一旦一段代码从主应用程序中提取出来并放入一个“分离的”动态链接库中,就更容易攻击和分析(反向工程)代码,因为它已经被隔离了。当同一段代码保存在LIB库中时,它是已编译(链接)的目标应用程序的一部分,因此很难将这段代码与其余的目标二进制文件隔离(区分)。
DLL是在其他可执行程序之间共享的函数库。只要看看你的windows/system32目录,你就会找到几十个。当您的程序创建一个DLL时,它通常也会创建一个lib文件,以便应用程序*.exe程序可以解析DLL中声明的符号。
.lib是一个静态链接到程序的函数库——它们不被其他程序共享。与*链接的每个程序。Lib文件中有该文件中的所有代码。如果你有两个程序A.exe和B.exe链接到C.lib,那么每个A和B都将包含C.lib中的代码。
如何创建dll和库取决于所使用的编译器。每个编译器都是不同的。
另一个区别在于性能。
由于DLL在运行时由.exe(s)加载,.exe(s)和DLL使用共享内存的概念,因此性能相对于静态链接较低。
另一方面,.lib是在编译时静态链接到每个请求进程的代码。因此.exe将只有一个内存,从而提高了进程的性能。