DLL和LIB文件-什么和为什么?

DLL和LIB文件-什么和为什么?,dll,static-libraries,Dll,Static Libraries,我对DLL和LIB知之甚少,只知道它们包含程序正常运行所需的重要代码-库。但为什么编译器会生成它们呢?在一个可执行文件中包含所有代码不是更容易吗?DLL和LIB的区别是什么?创建DLL/LIB而不仅仅是将代码编译成可执行文件的一个重要原因是重用和重新定位。例如,一般的Java或.NET应用程序很可能会使用多个第三方(或框架)库。只根据预先构建的库进行编译比将所有第三方代码编译到应用程序中要容易得多,速度也快得多。将代码编译到库中还可以鼓励良好的设计实践,例如,设计用于不同类型应用程序的类。有静态

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

创建DLL/LIB而不仅仅是将代码编译成可执行文件的一个重要原因是重用和重新定位。例如,一般的Java或.NET应用程序很可能会使用多个第三方(或框架)库。只根据预先构建的库进行编译比将所有第三方代码编译到应用程序中要容易得多,速度也快得多。将代码编译到库中还可以鼓励良好的设计实践,例如,设计用于不同类型应用程序的类。

有静态库(LIB)和动态库(DLL)-但请注意,.LIB文件可以是静态库(包含对象文件)或导入库(包含允许链接器链接到DLL的符号)

之所以使用库,是因为您可能需要在许多程序中使用代码。例如,如果您编写了一个计算字符串中字符数的函数,那么该函数在许多程序中都会很有用。一旦该函数正常工作,您就不希望每次使用它时都必须重新编译代码,因此您可以将在库中为该函数提取可执行代码,链接器可以将编译后的代码提取并插入到程序中。因此,静态库有时被称为“存档”

动态库更进一步。让库函数的多个副本占用每个程序中的空间似乎是浪费。为什么它们不能共享函数的一个副本?这就是动态库的用途。与其在编译程序时将库代码构建到程序中,还不如通过映射来运行它在加载到内存时将其加载到程序中。同时运行且使用相同函数的多个程序都可以共享一个副本,从而节省内存。事实上,您只能根据需要加载动态库,具体取决于代码的路径。如果不进行任何打印,则打印机例程占用内存没有意义。另一方面,这意味着您必须在运行程序的每台计算机上安装一份动态库的副本。这会产生一系列问题


例如,几乎所有用“C”编写的程序都需要一个名为“C运行时库”的库中的函数,但很少有程序需要所有函数。C运行时有静态和动态两种版本,因此您可以根据特定需要确定程序使用的版本。

另一个方面是安全性(混淆)。一旦从主应用程序中提取一段代码并将其放入“分离的”动态链接库中,就更容易攻击、分析(逆向工程)代码,因为它已被隔离。当同一段代码保存在库中时,它是编译(链接)的一部分目标应用程序,因此更难隔离(区分)来自其余目标二进制文件的那段代码。

DLL是在其他可执行程序之间共享的函数库。只需查看windows/system32目录,就会找到几十个。当程序创建DLL时,通常还会创建一个lib文件,以便应用程序*.exe程序可以解析符号在DLL中声明的

.lib是静态链接到某个程序的函数库,其他程序不共享这些函数。每个链接到*.lib文件的程序都有该文件中的所有代码。如果有两个链接到C.lib的程序A.exe和B.exe,则每个A和B都将包含C.lib中的代码


创建DLL和LIB的方式取决于所使用的编译器。每个编译器的操作方式不同。

另一个不同之处在于性能

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


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

证明,
.lib
文件可以是静态库(包含对象文件)或导入库(包含允许链接器链接到DLL的符号)。很好的解释!应用程序之间共享代码,并且(默认情况下)不共享数据正在使用Dll。@Lumi:这一点很好。就Dll而言,我们有两种类型的链接。隐式链接,当我们有一个由Dll创建者提供的
.lib
文件以及适当的头时;这个
.lib
只是目标Dll的一个描述符,它包含地址、入口点等,但没有代码。这个
.lib
必须通过第二个是显式链接,当我们使用DLL时,通过使用
LoadLibrary
函数手动加载它。在这种类型中,我们不需要
.lib
文件,但我们必须花点力气找到DLL导出及其地址,并通过指针调用这些函数。对不起,如果我有头(.h)和c(.c)在我的项目中包含的文件,是图书馆可执行的编译和运行吗?我没有说的利弊,如果它能够编译和运行安全方面是我新的。上面的推理是真实的情况下,C的应用程序调用一个本地的非托管C++ DLL?但LIB是孤立的,不是吗??因此攻击者可以简单地分析库。或者,公共无法访问库是常见的情况吗?就编译器进程而言,库也是“孤立的”,但一旦