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