什么是lib文件,lib和dll的关系如何

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

selected from: http://topic.csdn.net/t/20020927/11/1057549.html

问题:

一直没搞清楚编译dll后生成的lib文件到底是干什么用的?如果采用静态连接,为什么老是需要lib文件?而通过loadlibrary则不需要?如果是静态连接,是否我的dll程序一旦改动而从新编译过后,就还需要从新编译调用dll的程序?

答案汇总:

rivershan

程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。

当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。

stonespace

调用dll的export函数是不需要lib的,dll本身就是和lib同一个级别的东西,也提供类似的功能,调用dll函数只需要loadlibrary就行,但是你也发现,用loadlibrary很麻烦,要取出函数的地址,然后还要定义一个调用的原型。用dll比用静态链接库lib要麻烦得多。

微软为了解决这个问题,在编译dll的时候,顺便生成一个引入库lib文件,这个lib不包含实际功能代码,只不过用来帮你做那些loadlibrary的麻烦工作,让你用dll和用一般的lib一样方便。

dll改过之后,只要export函数的声明没有修改,也就是参数、函数名、返回值没有发生变化,调用代码不需要重新编译。不过export函数声明修改过就必须重编译。

alphapiao

使用动态dll有两种方法,一种是隐式链接,一种显示链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接

时间: 2024-10-06 22:55:49

什么是lib文件,lib和dll的关系如何的相关文章

.lib文件 .h文件 .dll文件

.lib代表的是静态数据连接库,在windows系统中起到链接程序和函数的作用,存放的是函数的是函数调用的信息,是obj文件的集合.相当于linux中的.a或.0. .so文件.lib文件是不对外公开的,不能查看编译过后的文件. lib有静态lib和动态lib之分. 静态lib将导出声明和实现都放在lib中,即包含函数代码本身,编译后所有代码都嵌入到宿主程序. 动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明.编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的d

VC++中.DLL文件与.LIB文件关系

一般的LIB文件是"导入库",用来提供给link.exe,作为链接DLL--也就是"动态链接库"的依据.里面记录了类似下面的信息:调用函数xxx(),连接到x.dll的0xABCDEFGH地址:-- 早期的LIB,是"静态链接库",也是用来提供给link.exe,作为链接代码用的.里面的记录如下:调用xxx(),其代码是--:DLL的LIB(导入库),不含可执行的具体代码(代码在DLL中).而最早的LIB(静态链接库),里面含有代码.所以,可以看

c++中.dll与.lib文件的生成与使用的详解

两种库: ? 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.? 包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library.共有两种链接方式: ? 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息.? 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库

lib文件和dll文件

一. 简介 1.1 C++两种库文件 lib包含了函数所在的dll文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的dll提供,称为动态链接库dynamic link library.(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布) lib包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library.(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文件) 1.

LIB文件和DLL文件的作用

(1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib文件和dll文件.lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的.如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中.如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中.静态编译的lib文件有好处:给用户安装时就

VS2010 C++环境下DLL和LIB文件的生成与调试

利用VS2010工具,调试DLL文件的方法现总结如下: 在一个解决方案中生成两个工程,假设MYDLL和MYDLG两个工程,前者是DLL工程,后者DLG调用前边的DLL工程.设置如下: 目录如下:图,本文例子中,DLL文件和EXE文件都生成在下边的这个DEBUG文件中:D:\My Documents\Visual Studio 2010\Projects\MYDLL\Debug,当然,也可以生成在其他文件目录下,只要设置正确即可.     目的:遵循DLL和exe最后生成的文件在一个目录内,且两个

VC6.0 设置动态链接库工程生成dll以及lib文件的位置

在"Projet"->"Settings..."的"Link"选项卡中 "Output file name"中设置dll的输出路径 Project options:中可以看到刚刚设置生成的DLL路径, 紧跟着就是LIB文件的路径,默认应该是DEBUG或者release的目录下, 这里需要手动修改LIB路径到你所需要的设置生成相应lib文件的所在路径,下面一句设置是Release模式下路径: /out:"../U

windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件

如题. 环境:windows10 64位,vs 2010,matlab r2014a,配置成功,生成.dll,.h,.lib文件成功. 步骤一:matlab动态链接库文件编译生成 1)编写示例文件add.m function c = add(a, b); c = a + b; end; 2)编译打包 进入matlab主界面,在控制台输入deploytool命令,调用打包程序,选择"Library Compiler": 3)进入库文件编译程序界面,根据需要勾选C++ Shared Lib

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

.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有. .h .lib .dll三者的关系是: H文件作用是:声明函数接口 DLL文件作用是: 函数可执行代码 当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: