ITKeyword,专注技术干货聚合推荐

注册 | 登录

.h头文件 .lib动态链接库文件 .dll 动态链接库

u012209626 分享于 2015-04-02

推荐:静态链接库lib, 动态链接库dll,导入库lib的区别

动态链接库有两种两用方式,分别是动态调用.dll和静态调用导入库.lib,那么动态链接库的静态调用方式与静态链接库调用有什么区别带着这个问题,查找到以下资料

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1053

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

(一).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。

附加依赖项的是.lib 不是.dll ;若生成了DLL ,则肯定也生成 LIB文件。

如果要完成源代码的编译和链接,有头文件和lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。


(二).h .lib .dll三者的关系是:

.H文件 作用是:声明函数接口 
.DLL文件 作用是: 函数可执行代码 
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢? 这就是.LIB 文件的作用: 告诉链接器,调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置 
这也就是为什么需要附加依赖项 .LIB文件 ,它起到桥梁的作用。

如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中。

(三)目前以lib后缀的库有两种:       
         (1)一种为静态链接库(Static Libary,以下简称“静态库”):
 静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起,换言之,静态库中包含了函数的实际执行代码、符号表等。当发生链接时,即把.lib文件中用到的函数代码直接链接进目标程序,称为目标文件的一部分(这就使得静态库链接得到的目标程序比较大),程序运行的时候不再需要其它的库文件;比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。  (2)另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”,.lib文件,就类似于头文件一样,包含的是被DLL导出的函数的名称和位置(即所谓的一些索引信息))。 
 动态库.DLL一般会有对应的导入库.lib,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

导入库和静态库的区别很大,他们实质是不一样的东西。 (1)静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。 

       (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的(即为静态链接库),索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
       再重申一次,在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是.DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,.DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。


在VS2008中添加.LIB文件

法一:在project属性->链接器->输入->附加依赖项

在以上路径加入即可,多个lib名用空格隔开

 

法二:直接在代码中表现:

推荐:静态链接库(Lib)与动态链接库(DLL)的区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数

#pragma comment(lib,"winmm.lib")   // 加入winmm.lib库


原文出处:http://blog.csdn.net/c395565746c/article/details/5402239

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

扩展:

动态链接库的概念:
   动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。
   动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
   一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。

来源:动态链接库,静态链接库和可执行文件的区别

内存映射文件:

是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。

内存映射文件正是解决本地多个进程间数据共享的最有效方法。



推荐:动态链接库dll,静态链接库lib, 导入库lib

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下

(一).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib 不是.dll ;若生成了DLL ,则肯定也生成 LIB文件。 如果要完成源代码的编译和链接,有头文件和lib

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。