您的位置:首页 > 其它

lib和dll文件的区别和联系

2017-06-26 10:26 141 查看
转载自lib和dll文件的区别和联系

(1)lib文件是必须在编译阶段就连接到应用程序中的,而dll文件是运行期才会被调用的。。如果要完成源代码的编译,有lib就够了。如果也使动态链接的程序运行起来,有dll就够了。在开发和调试阶段,最好都有。

(2)一般的动态库程序有lib文件和dll文件。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不用挂动态库了。缺点就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置(索引信息),DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行程序中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

realse版本只需要DLL文件就可以了,debug版本需要lib文件和dll文件。

一、开发和使用dll需注意三种文件

1、dll头文件

它是指dll中说明输出的类或符号原型或数据结构的.h文件。当其他应用程序调用dll时,需要将该文件包含入应用程序的源文件中。

2、dll的引入库文件(.lib)

它是在编译、链接成功后生成的文件。主要作用是当其他应用程序调用dll时,需要将该文件引入应用程序。否则,dll无法引入。

3、dll文件(.dll)

它是应用程序调用dll运行时,真正的可执行文件。dll应用在编译、链接成功后,dll文件即存在。开发成功后的应用程序在发布时,只需要.exe文件和.dll文件,不必有.lib文件和dll头文件。

动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被应用的函数,并将库同代码一起放到可执行文件中。

使用动态链接代替静态链接有若干优点。DLL节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展MFC库类的机制,支持多语言程序,并使国际版本的创建轻松完成。

下面通过一个例子来理解lib和dll

一个简单的C++程序,只需要一个源文件,这个源文件包含了如下语句

int main()
{ return 0; }
当需要程序做事情时,我们会把越来越多的语句添加到源文件中,例如,我们会开始在main函数添加代码:

#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
当一个函数中包含了太多的语句时,便不太容易被理解,这时候开始需要子函数:

#include <stdio.h>
void ShowHello()
{
printf("Hello World!\n");
}
int main()
{
ShowHello();
return 0;
}
一个源文件中包含了太多的函数,同样不好理解,人们开始分多个源文件了

/ main.cpp
void ShowHello();//为了说明的需要,我这里使用直接声明的方式,实际工程中是应该使用头文件的
int main()
{
ShowHello();
return 0;
}
// hello.cpp
#include <stdio.h>
void ShowHello()
{
printf("Hello World!\n");
}


将这两个文件加入到一个工程中,它们会被分别编译,最后链接在一起。在vc编译器的输出窗口,可以看到如下信息:
-------------------Configuration: hello - Win32 Debug-------------------- 
Compiling... 
main.cpp 
hello.cpp 
Linking...  
hello.exe - 0 error(s), 0 warning(s) 

这展示了它们编译链接的过程。

当一个工程中有太多源文件也不好理解,于是,将一部分源文件预先编译成库文件,也即lib文件,当要使用其中的函数时,只需要链接lib文件就可以了,而不用再理会最初的源文件。

在VC中新建一个static library类型的工程,加入hello.cpp文件,然后编译,就生成了lib文件,假设文件名为hello.lib。 
别的工程要使用这个lib有两种方式: 
1 在工程选项-〉link-〉Object/Library Module中加入hello.lib 
2 可以在源代码中加入一行指令 
#pragma comment(lib, "hello.lib") 
注意这个不是C++语言的一部分,而是编译器的预处理指令,用于通知编译器需要链接hello.lib 
根据个人爱好任意使用一种方式既可。 
这种lib文件的格式可以简单的介绍一下,它实际上是任意个obj文件的集合。obj文件则是cpp文件编译生成的,在本例中,lib文件只包含了一个obj文件,如果有多个cpp文件则会编译生成多个obj文件,从而生成的lib文件中也包含了多个obj,注意,这里仅仅是集合而已,不涉及到link,所以,在编译这种静态库工程时,你根本不会遇到链接错误。即使有错,错误也只会在使用这个lib的EXE或者DLL工程中暴露出来。 

关于静态lib,就只有这么多内容了,真的很简单,现在我们介绍另外一种类型的lib,它不是obj文件的集合,即里面不含有实际的实现,它只是提供动态链接到DLL所需要的信息。这种lib可以在编译一个DLL工程时由编译器生成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: