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