windows中LIB和DLL的区别与使用
c++中共有两种库:
1、LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布)
2、LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文件)
共有两种链接方式:
1、动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
2、静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。
关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(静态连接)使用lib需注意两个文件:
(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,略。
(动态连接)使用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
使用lib的方法:
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,根本不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
别的工程要使用这个lib有两种方式:
(1)在project->link->Object/Library Module中加入Lib.lib文件(先查询工程目录,再查询系统Lib目录);或者在源代码中加入指令#pragma comment(lib, “Lib.lib”)。
(2)将Lib.lib拷入工程所在目录,或者执行文件生成的目录,或者系统Lib目录中。
(3)加入相应的头文件test.h。
使用DLL的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
创建DLL工程的方法(略)。
(1)隐式链接
第一种方法是:通过project->link->Object/Library Module中加入.lib文件(或者在源代码中加入指令#pragma comment(lib, “Lib.lib”)),并将.dll文件置入工程所在目录,然后添加对应的.h头文件。
#include "stdafx.h"
#include "DLLSample.h"
#pragma comment(lib, "DLLSample.lib") //你也可以在项目属性中设置库的链接
int main()
{
TestDLL(123); //dll中的函数,在DllSample.h中声明
return(1);
}
(2)显式链接
需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)。
#include
#include //使用函数和某些特殊变量
typedef void (*DLLFunc)(int);
int main()
{
DLLFunc dllFunc;
HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
if (dllFunc == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc(123);
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
LoadLibrary函数利用一个名称作为参数,获得DLL的实例(HINSTANCE类型是实例的句柄),通常调用该函数后需要查看一下函数返回是否成功,如果不成功则返回NULL(句柄无效),此时调用函数FreeLibrary释放DLL获得的内存。
GetProcAddress函数利用DLL的句柄和函数的名称作为参数,返回相应的函数指针,同时必须使用强转;判断函数指针是否为NULL,如果是则调用函数FreeLibrary释放DLL获得的内存。此后,可以使用函数指针来调用实际的函数。
最后要记得使用FreeLibrary函数释放内存。
注意:应用程序如何找到DLL文件?
使用LoadLibrary显式链接,那么在函数的参数中可以指定DLL文件的完整路径;如果不指定路径,或者进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:
(1)包含EXE文件的目录
(2)工程目录
(3)Windows系统目录
(4)Windows目录
(5)列在Path环境变量中的一系列目录
关于dll库和lib库的区别如下:
1、使用场景不同:lib是编译时用到的,dll是运行时用到的。
如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要dll。
2、用途不同:如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位 置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
使用静态编译的lib文件,在运行程序时 不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才可以。
3、应用对象不同:动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL 文件。
在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。
DLL和LIB文件必须随应用程序 一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
扩展资料:
dll库和lib库使用方法:
1、使用lib的方法:
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
2、使用dll的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
参考资料来源:百度百科—lib
参考资料来源:百度百科—dll
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
window10怎样修改账户用户名
1,首先在开始菜单,右键,选择运行 2、输入netplwiz回车,3、打开用户账户,双击当前账户,例如:Administrator 4、打开后如图 5、输入你想要改的名字 6、点击确定后,弹出警告,点击是,如图 7、注销后发现账户名就改过来了,如图
设置windows系统年龄选错怎么改?
点击 Windows 系统左下角的“开始”按钮,选择“设置”。在设置窗口中,选择“账户”。选择您要更改的用户账户,然后选择“更改账户设置”。滚动到“个人资料”部分,在“出生日期”下拉菜单中更改您的出生日期,然后单击“保存”。重新启动计算机,以便系统能够更新您的新设置。请注意,这种方法只会更改您...
在windows自带的日文输入法下 如何 打出て下面带小い 也就是ti_百度知...
小写的あいうえお 用la、li、lu、le、lo或xa、xi、xu、xe、xo都可以:teli texi :てぃ
Windows10中multiple是什么意思?
multipleeditions是零售版。WIN10的MultipleEditions版指的是核心版和专业版的混合。主要针对家庭,有家庭普通版,高级版专业版的区别。multipleeditions是零售版,有core和pro版本可以选择,后期还能升级到prowithwmc,安装时需要输入key密匙。multiple_edition是专业版professional和家庭home版集成的版本,安装时...
windows下liuzi文件夹
百分百是毒或木马 用360急救箱试试,在360官网有下。如果还不行,下载一个魔方,在系统设置 中选择右键菜单,再选择添加右键菜单项目,最后选择勾选“管理员取得所有权”在liuzi文件夹上单击右键,选择管理员取得所有权,再删除试一试。如果不能删除,再进入魔方,在系统清理中选择磁盘空间分析,找到该...
怎样调整ul 中li之间的距离
需要准备的工具:Windows操作系统、浏览器、html编辑器。调整ul列表中li之间的距离的步骤如下:1、首先,打开html编辑器并创建一个新的html文件,命名为index.html,以填充问题基础代码。2、其次,在index.html索引中的<style>标签中。输入css样式代码:li{padding top:49px;}。3、浏览器运行index.html...
开机非常li
}自己可以在网上下载系统,并且自己动手做系统,不花钱用电脑硬盘安装系统,可以安装WIN7的系统,具体操作如下:1.首先到ghost基地\/win7去下载WIN7的操作系统:2.将下载的WIN7的操作系统,解压到D盘,千万不要解压到C盘。3.打开解压后的文件夹,双击“硬盘安装器”,在打开的窗口中,点击“安装”.即可...
css怎么去除li的点
css去除li的点的方法:1、通过“<li style="list-style-type:none;">xx<\/li>”方式去除;2、通过“list-style-type:none;”方式去除;3、通过设置class来去除。本文操作环境:windows7系统、HTML5&&CSS3版、Dell G3电脑。css去除li的点 方法一:<ul><li style="list-style-...
微软io1.1鼠标宏设置方法:安装完英特尔liPoint软件
在安装Intel liPoint软件之后,您可以从控制面板中的鼠标界面启动Intel liPoint,或者直接从开始菜单启动程序。英特尔liPoint软件界面非常简单,并且与Windows鼠标面板完美融合。它看起来不像游戏鼠标驱动程序那样华丽和直观,但是请不要轻视它。第一步是单击按钮设置宏,然后选择“宏编辑器”以弹出宏编辑器界面...
如何用Linux连接Windows的远程桌面?
1.首先,开启Windows远程连接,这个是远程桌面连接的前提,直接在“我的电脑->属性->远程设置”中勾选就行,如下:2.接着就是在Linux中安装rdesktop,以Centos7为例,需要运行如下3条命令,先下载安装rpm包,获取yum源,然后才能直接安装(如果是Ubuntu系统,则直接apt安装即可):wgethttp:\/\/li.nux....
虿芝金熊: 关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中...
肃州区18721327908: 静态链接库LIB和动态链接库DLL的区别 - ?
虿芝金熊: 一、动态链接库的概念 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件...
肃州区18721327908: lib和dll有什么区别,什么叫静态链接库,什么叫动态连接库 - ?
虿芝金熊: 静态链接库与动态链接库区别静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了.但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,...
肃州区18721327908: 后缀名“.dll obj lib”和“ so o a”文件的区别含义 - ?
虿芝金熊: (1) .dll .obj .lib使用在windows平台下..dll:动态链接库,作为共享函数库的可执行文件..obj:目标文件,相当于源代码对应的二进制文件,未经重定位..lib:可理解为多个obj的集合,本质与.obj相同.(2) .so .o .a使用在linux平台下..so:(share object)动态链接库,跟Windows平台类似..o: 目标文件,相当于源代码对应的二进制文件..a: 与.o类似,多个.o的集合.
肃州区18721327908: 问问各位大神,.h文件、.dll文件、.lib文件的区别 - ?
虿芝金熊: .h头文件.dll动态链接库.lib有静态链接库 windows API可能在.dll,.ocx文件里,.lib应该也能吧?
肃州区18721327908: 动态链接库,静态链接库和可执行文件的区别是什么? - ?
虿芝金熊: 二、动态链接库的优点 1. 共享代码、资源和数据使用DLL的主要目的就是为了共享代码,DLL的代码可以被所有的Windows应用程序共享. 2. 隐藏实现的细节DLL中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节. ...
肃州区18721327908: dll文件与系统API的区别? - ?
虿芝金熊: dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行. ?????? .lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那...
肃州区18721327908: api与dll的联系和区别! - ?
虿芝金熊: API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口 DLL 是一个包含可由多个程序同时使用的代码和数据的库.例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数.因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框.这有助于促进代码重用和内存的有效使用.
肃州区18721327908: 编译时静态链接库和动态链接库的区别在于 - ?
虿芝金熊: 动态链接库更类似于一种服务,而静态链接库就是一种把一些编译好的代码存放起来的仓库.动态链接库还可以包含动态链接库或者静态链接库,而静态链接库中则不能使用别的库代码 动态链接库只有当程序执行到调用库函数的时候才会找到库...
肃州区18721327908: 谁能解释一下.lib文件和.obj文件的区别 - ?
虿芝金熊: lib是若干个obj的集合,本质与obj相同,obj是目标文件,一般是程序编译后的二进制文件,通过链接后就成为exe文件(即链接器将使用这些文件生成EXE文件).但obj只给出了程序的相对地址,而EXE是绝对地址.