lib和dll文件的区别和联系
vs2010下lib和dll文件的使用
vs2010下lib和dll文件的使用——笔记一、lib文件的简介.lib是一种文件后缀,是Windows操作系统的库文件,有静态lib和动态lib 之分:1)、静态lib文件:将导出的文件的声明和实现都放在lib文件中,此时lib 文件主要包含函数的实现部分(cpp文件),例如类的函数定义。
使用时只需配合相关的头文件,编译后程序将lib文件中的代码嵌入到宿主程序中,也就是最后的exe文件中,此时移除lib文件,程序可以正常运行,即编译后就不需要lib 文件的支持了。
2)、动态lib文件:相当于是一个h头文件,用于支持相应的dll文件的运行。
里面存储的是dll文件中各个导出函数的地址,达到链接主程序与dll文件的目的。
二、dll文件的生成vs2010生成dll文件,生成dll文件的时候需要对应的lib文件才能使用,dll生成方法如下(此处只是生成部分,在使用时还需修改):1)新建工程,选择“win32项目”,注意不是“win32控制台项目”,下一步选择生成dll文件,其余默认;2)添加需要封装的.cpp文件,并加入对应的.h文件,先说明类的封装(也就是类的cpp文件)头文件.hclass __declspec(dllexport) NB (类的头文件中只需修改此处即可){public:private:}其中关键字dllexport说明该类的实现部分需要导出。
源文件.cpp添加一句#include "stdafx.h"即可再说明一下一般函数的封装将函数的定义改为extern"C"__declspec(dllexport) float add(float a, float b);extern"C"__declspec(dllexport) float MIN(float a,float b);float MAX(float a,float b);函数MAX为导出到dll文件中,因此相当于不可见。
lib和dll文件的区别和联系
lib和dl l文件的区别和联系什么是lib文件,lib和dl l的关系如何(2008-04-18 19:44:37)(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有li b文件和d ll文件。
lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
如果有dll文件,那么对应的l ib文件一般是一些索引信息,具体的实现在dll文件中。
如果只有li b文件,那么这个li b文件是静态编译出来的,索引和实现都在其中。
静态编译的l ib文件有好处:给用户安装时就不需要再挂动态库了。
但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的D LL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
一、开发和使用d ll需注意三种文件1、dll头文件它是指dll中说明输出的类或符号原型或数据结构的.h文件。
当其它应用程序调用dl l时,需要将该文件包含入应用程序的源文件中。
dll是什么东西?
dll是什么东西?
作为⼀个刚刚接触编程的菜鸟级程序员可能会对⼀个⼜⼀个的名词所困扰,不知道这些东西是什么?能⼲什么?有何意义?接下来我们⼀起聊聊dll,共同学习⼀下。
百度百科解释:动态链接库英⽂为DLL,是Dynamic Link Library 的缩写形式,DLL是⼀个包含可由多个程序同时使⽤的代码和数据的
库,DLL不是可执⾏⽂件。
动态链接提供了⼀种⽅法,是进程可以调⽤不属于其可执⾏代码的函数。
函数的可执⾏代码位于⼀个DLL中,该DLL包含⼀个或多个已被编译、链接并与使⽤它们的进程分开存储的函数。
DLL还有助于共享数据和资源。
多个⽤⽤程序可同时访问内存中单个DLL副本的内容。
动态链接库⽂件,是⼀种不可执⾏的⼆进制程序⽂件,它允许程序共享执⾏特殊任务所必需的代码和其他资源。
优点
1.扩展了应⽤程序的特性;
2.可以⽤许多种编程语⾔来编写;
3.简化了软件项⽬的管理;
4.有助于节省内存;
5.有助于资源共享;
6.有助于应⽤程序的本地化;
7.有助于解决平台差异;
8.可以⽤于⼀些特殊的⽬的。
windows使得某些特性只能为DLL所⽤。
以上百度百科已经说的很明⽩了,以后⼤家打开程序时候bin⽂件夹下⾯装的.dll⽂件就是这个东西。
VC6环境中LIB与DLL文件的使用
/*********************************************************
主程序
**********************************************************/
void main(void)
{
cout<<COPYRIGHT<<endl;
#include <iostream.h> #include "Macro_Define.h" #include "Extern_Value.h" #include "Max_Func.h"
//宏定义头文件 //引用全局变量的头文件 //max 函数声明头文件
int max(int x, int y)
1. 关于本文
首先声明,这不是教程,也不是论文,仅当工作和学习札记。 作为程序员,我们经常要与别人合作完成编程工作。现代软件工程规模越来越大,一个 程序可能被分配给不同程序员,不同部门,甚至不同单位合作完成。这与一个人独立完成一 个程序的工作流程大不相同,“因为你不是一个人”在编程——你的程序最终要和其他人的 代码集成到一个系统中。 想一想吧,作为程序员,最痛苦的经历不是写程序,也不是阅读程序,最痛楚莫过于深 陷于一大堆没有秩序的代码“泥沼”之中。 记住:我们是程序员,我们为程序员写程序。像热爱我们的生活一样去打理我们的程序 吧——I love this program!
工程保存位置,在 Project name 中输入工程名 Test_Project_2,建立“An empty project”。
(2)File → New → Files → C++ Source File。在 File 中输入文件名 Test_Main,
qt下调用dll的方法
qt下调用dll的方法[转] 问题引出:有个微机测控的课程实验,要写个监测温度和湿度的程序。
要求通过调用传感设备厂商提供的.DLL库,.LIB库和.h头文件,用MFC写个用户界面。
问道:我想用其他的GUI来开发可不可以?老师:不行,因为提供的库是只能用在MFC 里面的。
我其实是想问,是不是要求必须用MFC,结果老师的回答真让人觉得。
还有这回事?这里的肯定也可以用在别的GUI开发程序里面,这些东西本质上都是C++库啊。
我是想用Qt来开发,开发出来效果肯定很炫的了。
分析下头文件,只是相关结构体和函数声明,类似于int WINAPI ltm_com_open(int port, int baud, int rtsdtr);就是很普通的Win32函数,感觉用在Qt里面应该没问题。
用VC开发只需要把该头文件和.lib库文件添加到工程里面。
如何用VC或者 DEV-C++或者Qt生成DLL和LIB的问题就不说了,关于.DLL和.lib 文件的关系简要说明如下:DLL与LIB的区别:1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立,当然还有其它相关的不同,用lib.exe就知道了;2.在生成dll时,经常会生成一个.lib(导入与导出),这个lib实际上不是真正的函数集,其每一个导出导入函数都是跳转指令,直接跳转到DLL中的位置,这个目的是外面的程序调用dll时自动跳转;3.实际上最常用的lib是由lib.exe把*.obj生成的lib。
(引用这里)Qt想调用DLL怎么办呢?最先想到的是直接调用试试看:包含头文件,并把DLL文件拷到当前目录下,调用声明的函数,结果链接时和预想的一样出错了。
修改Makefile.debug,的链接选项也不行。
Windows里的gcc调编译时用的库是和Linux一样的.a文件。
什么是lib文件, Lib 和 DLL 文件有什么区别
3、 dll 文件(.dll) 它是应用程序调用 dll 运行时,真正的可执行文件。dll 应用在编译、链接成功后,.dll 文件 即存在。开发成功后的应用程序在发布时,叧需要有.exe 文件和.dll 文件,丌必有.lib 文件和 dll 头文件。
动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使迚程可以 调用丌属亍其可执行代码的函数。函数的可执行代码位亍一个 DLL 中,该 DLL 包含一个戒多 个已被编译、链接幵不使用它们的迚程分开存储的函数。DLL 还有助亍共享数据和资源。多 个应用程序可同时访问内存中单个 DLL 副本的内容。
lib 不 dll 文件最大区别在调用方面 dll 可以静态陷入
lib 不 DLL
从这一章起,我讲述的内容将特定亍 windows 平台。其实这篇文章也可看作是我在 windows 下的开发经验总结,因为以后我决定转 unix 了。 前面有一章说编译不链接的,说得很简略,其实应该放到这一章一块儿来说的。许多单讲 C++的书其实都过亍学院派,对亍真实的工作环境,上百个源文件怎么结合起来,几乎没有 提及。我引导读者一步步看看 lib 不 DLL 是怎么回事。
什么是 lib 文件,lib 和 dll 的关系如何
(1) lib 是编译时需要的,dll 是运行时需要的。 如果要完成源代码的编译,有 lib 就够了。 如果也使动态连接的程序运行起来,有 dll 就够了。 在开发和调试阶段,当然最好都有。
CV_EXPORT定义的作用
CV_EXPORT定义的作用,lib及dll的区别1. CV_EXPORT定义的作用在core.hpp中,CV_EXPORT是出现频率最高的词之一。
1. CV_EXPORT是什么?有什么用?2. CV_EXPORT会涉及到dll的东西,那么dll是什么,lib与dll的区别是什么?CV_EXPORTS 出现的用法:class CV_EXPORTS MatExpr;template<typename _Tp> class CV_EXPORTS Size_;CV_EXPORT的定义:#if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS #define CV_EXPORTS __declspec(dllexport)#else#define CV_EXPORTS#endif实质上就是__declspec(dllexport)的定义:msdn对其解释:/zh-cn/library/a90k134d(v=vs.80).aspx在更新的编译器版本中,可以使用__declspec(dllexport)关键字从DLL 导出数据、函数、类或类成员函数。
__declspec(dllexport)会将导出指令添加到对象文件中,因此在指定的对象文件里您不需要使用.def 文件。
当试图导出C++ 修饰函数名时,这种便利最明显。
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边。
其他概念:动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。
导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。
MFC提供的修饰符号_declspec(dllexport) 就是表示导出函数或变量。
模块定义文件(.DEF)是一个或多个用于描述DLL属性的模块语句组成的文本文件。
QT代码封装成dll和lib文件及使用
QT代码封装成dll和lib⽂件及使⽤开发环境:win7+QT5.8(msvc2015)⼀、Qt代码封装成dll和lib⽂件1.创建library⼯程debug模式下,运⾏,⽣成.dll和.lib等⽂件注意: debug 和 release 两种模式下⽣产的⽂件是在各⾃⽣成⽬录下的,即两种运⾏模式下⽣成的⽂件分别会在如图10中的不同位置:***debug/debug/ 和 ***release/release/。
debug 模式下就去***debug⽂件夹下的debug⽂件夹下找⽣成的库⽂件,release 模式下就去中***release ⽂件夹下的 release ⽂件夹下找⽣成的库⽂件2.在⼯程内添加内容在.pro⽂件中添加opencv3.2的include⽂件和lib⽂件在ncc_match.h⽂件中添加相关的include⽂件和函数在创建的ncc_match.cpp⽂件添加函数实现3.点击运⾏按钮,就会⽣成封装好的.dll和.lib等⽂件,在对应的debug或者release⽬录下可以看到⽣成好的⽂件。
⼆、dll⽂件使⽤1.创建测试⼯程2.修改.pro⽂件在.pro⽂件中添加:QT += core,并注释掉CONFIG -= qt在.pro⽂件中添加INCLUDEPATH+=C:\opencv\build\include\C:\opencv\build\include\opencv\C:\openc\build\include\opencv2LIBS+= C:\opencv\build\x64\vc14\lib\opencv_world320.lib\C:\opencv\build\x64\vc14\lib\opencv_world320d.lib\在.pro⽂件中引⽤封装⽣成的.lib静态链接库LIBS += ***\Ncc_match.lib,其中***表⽰上⾯封装⽣成的.lib⽂件保存的路径3.拷贝ncc_match.h和ncc_match_global.h到测试⼯程⽬录下4.修改测试⼯程的main.cpp⽂件,release模式调⽤dll库5.运⾏⽣成build-ncc_match_test-Desktop_Qt_MSVC2015_64bit-Release⽂件夹6.把ncc_match.dll⽂件拷贝⾄build-ncc_match_test-Desktop_Qt_MSVC2015_64bit-Release/release⽂件夹下7再次运⾏。
C 调用DLL方法 及 DLL与lib的区别
对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.li下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
例:在应用程序中调用dll文件
——在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc
创建基于对话框的工程test,并在对话框上放置"load"按钮,先添加装载代码。
1.首先在testdlg.cpp的首部添加变量设置代码:
//设置全局变量glibsample用于存储dll句柄
HINSTANCE glibsample=null; //如果定义成HANDLE类型,则出错
//第二个变量showme是指向dll
库中showme()函数的指针
typedef int(* Showme)(void);
Showme showme;
2.利用classwizard为"load"按钮添加装载dll的代码
当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明
二, 显式的运行时链接 ,(我用的是此方法)
隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
关于静态链接库(Lib)与动态链接库(DLL)
关于静态链接库(Lib)与动态链接库(DLL)静态链接库(Lib)和动态链接库(DLL)的问题困扰了我很长时间,而当中关键的问题是两者有何联系?又有何区别呢?怎么创建?怎么使用?使用的过程中要注意什么?一直想把这个问题总结一下。
在windows下一般可以看到后缀为dll和后缀为lib的文件,但这两种文件可以分为三种库,分别是动态链接库(Dyna mic-Link Libraries),目标库(Object Li braries)和导入库(Import Libra ries),下面一一解释这三种库。
目标库(Object Li braries)目标库又叫静态链接库,是扩展名为.LIB的文件,包括了用户程序要用到的各种函数。
它在用户程序进行链接时,“静态链接”到可执行程序文件当中。
例如,在V C++中最常使用到的C运行时目标库文件就是LIB C.LIB。
在链接应用程序时常使用所谓“静态链接”的方法,即将各个目标文件(.obj)、运行时函数库(.lib)以及已编译的资源文件(.res)链接到一起,形成一个可执行文件(.exe)。
使用静态链接时,可执行文件需要使用的各种函数和资源都已包含到文件中。
这样做的缺点是对于多个程序都使用的相同函数和资源要重复链接到exe文件中,使程序变大、占用内存增加。
导入库(I mport Li braries)导入库是一种特殊形式的目标库文件形式。
和目标库文件一样,导入库文件的扩展名也是.LIB,也是在用户程序被链接时,被“静态链接”到可执行文件当中。
但是不同的是,导入库文件中并不包含有程序代码。
相应的,它包含了相关的链接信息,帮助应用程序在可执行文件中建立起正确的对应于动态链接库的重定向表。
比如KERNEL32.LIB、USER32.LIB和GDI32.LIB就是我们常用到的导入库,通过它们,我们就可以调用Windows提供的函数了。
如果我们在程序中使用到了Rec tangle这个函数,GDI32.LIB就可以告诉链接器,这个函数在GDI32.DLL动态链接库文件中。
C++ 调用DLL方法
C++ 调用DLL方法①LIB文件直接加入到工程文件列表中在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
②设置工程的 Project Settings来加载DLL的LIB文件打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
③通过程序代码的方式加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。
因为,在Debug方式下,产生的LIB文件是Debug 版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。
静态链接库LIB和动态链接库DLL的区别1.什么是静态连接库,什么是动态链接库静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。
但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
静态链接库与静态链接库调用规则总体比较如下。
对于静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下:extern "C" 函数返回类型函数名(参数表);在调用程序的.cpp源代码文件中如下:#include "..\lib.h"#pragma comment(lib,"..\\debug\\libTest.lib")//指定与静态库一起链接第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。
动态链接库及静态链接库(windows下的.dll.lib和linux下的.so.a)
动态链接库及静态链接库(window s下的.dll .lib和li nux下的.so .a)库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。
例如:libhel lo.so libhel lo.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:libhel lo.so.1.0,由于程序连接默认以.so为文件后缀名。
所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhel lo.so.1.0 libhel lo.so.1ln -s libhel lo.so.1 libhel lo.so使用库当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
然而,对动态库而言,就不是这样。
动态库会在执行程序内留下一个标记…指明当程序执行时,首先必须载入这个库。
由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
现在假设有一个叫hel lo的程序开发包,它提供一个静态库lib hello.a 一个动态库l ibhel lo.so,一个头文件h ello.h,头文件中提供sayhe llo()这个函数/* hello.h */void sayhel lo();另外还有一些说明文档。
这一个典型的程序开发包结构1.与动态库连接linux默认的就是与动态库连接,下面这段程序testl ib.c使用hel lo库中的sayhe llo()函数/*testli b.c*/#includ e#includ eint main(){sayhel lo();return 0;}使用如下命令进行编译$gcc -c testli b.c -o testli b.o用如下命令连接:$gcc testli b.o -lhello -o testli b在连接时要注意,假设libh ello.o 和libhe llo.a都在缺省的库搜索路径下/usr/lib下,如果在其它位置要加上-L参数与与静态库连接麻烦一些,主要是参数问题。
lib和dll文件的区别和联系
lib和dll文件的区别和联系分类:C/C++ 2013-07-23 12:38 142人阅读评论(0) 收藏举报libdll共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
静态链接使用静态链接库,链接器从静态链接库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装载。
动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)
动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。
例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:libhello.so.1.0,由于程序连接默认以.so为文件后缀名。
所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1ln -s libhello.so.1 libhello.so使用库当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
然而,对动态库而言,就不是这样。
动态库会在执行程序内留下一个标记…指明当程序执行时,首先必须载入这个库。
由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供sayhello()这个函数/* hello.h */void sayhello();另外还有一些说明文档。
这一个典型的程序开发包结构1.与动态库连接linux默认的就是与动态库连接,下面这段程序testlib.c使用hello库中的sayhello()函数/*testlib.c*/#include#includeint main(){sayhello();return 0;}使用如下命令进行编译$gcc -c testlib.c -o testlib.o用如下命令连接:$gcc testlib.o -lhello -o testlib在连接时要注意,假设libhello.o 和libhello.a都在缺省的库搜索路径下/usr/lib下,如果在其它位置要加上-L参数与与静态库连接麻烦一些,主要是参数问题。
DLL动态链接库和LIB静态链接库
1:神马是Dll和Lib,神马是静态链接和动态链接大家都懂的,DLL就是动态链接库,LIB是静态链接库。
DLL其实就是EXE,只不过没main。
动态链接是相对于静态链接而言的。
所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源。
而动态链接则是提供了一个函数的描述信息给可执行文件(并没有内存拷贝),当程序被夹在到内存里开始运行的时候,系统会在底层创建DLL和应用程序之间的连接关系,当执行期间需要调用DLL函数时,系统才会真正根据链接的定位信息去执行DLL中的函数代码。
在WINDOWS32系统底下,每个进程有自己的32位的线性地址空间,若一个DLL被进程使用,则该DLL首先会被调入WIN32系统的全局堆栈,然后通过内存映射文件方式映射到这个DLL的进程地址空间。
若一个DLL被多个进程调用,则每个进程都会接收到该DLL的一个映像,而非多份的拷贝。
但,在WIN16系统下,每个进程需要拥有自己的一份DLL空间,可以理解为何静态链接没啥区别。
2:DLL和LIB区别和联系。
DLL是程序在运行阶段才需要的文件。
LIB是程序编译时需要链接的文件。
DLL只有一种,其中一定是函数和过程的实现。
LIB是有两种。
若只生成LIB的话,则这个LIB是静态编译出来的,它内部包含了函数索引以及实现,这个LIB会比较大。
若生成DLL的话,则也会生成一个LIB,这个LIB和刚才那个LIB不同,它是只有函数索引,没有实现的,它很小。
但是这俩LIB依然遵循上个原则,是在编译时候是需要被链接的。
若不链接第一个LIB的话,在程序运行时会无法找到函数实现,当掉。
若不链接第二个LIB的话,在程序运行时依然会无法找到函数实现。
但第二种LIB 有一种替代方式,就是在程序里,使用LoadLibrary,GetProcAddress替代第二个LIB的功能。
vc调用动态库dll和lib
extern"C"void_fastcallfastcallproc(void);
//noname.cpp动态链接库实现文件
#include<windows.h>
extern"C"void_stdcallstdcallproc(void)
(1)静态链接到MFC 的规则DLL
静态链接到MFC的规则DLL与MFC库(包括MFC扩展 DLL)静态链接,将MFC库的代码直接生成在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。
使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
#pragma comment(lib,"RegularDll.lib")
3.3共享MFC DLL的规则DLL的模块切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。
动态链接库(DLL)
动态链接库(DLL)动态链接库和静态链接库:动态链接库⼀般不能直接执⾏,⽽且它们⼀般也不接收消息。
它们是包含许多函数的独⽴⽂件,这些函数可以被应⽤程序和其他 DLL 调⽤以完成某些特定的⼯作。
⼀个动态链接库只有在另外⼀个模块调⽤其所包含的函数时才被启动。
“静态链接” ⼀般是在程序开发过程中发⽣的,⽤于把⼀些⽂件链接在⼀起创建⼀个 Windows 可执⾏⽂件。
这些⽂件包括各种各样的对象模块(.OBJ),运⾏时库⽂件(.LIB),通常还有已编译的资源⽂件(.RES)。
与其相反,动态链接则发⽣在程序运⾏时。
静态库:函数和数据被编译进⼀个⼆进制⽂件,扩展名为(.lib)。
在使⽤静态库的情况下,在编译链接可执⾏⽂件时:链接器从静态库中复制这些函数和数据,并把它们和应⽤程序的其他模块组合起来创建最终的可执⾏⽂件(.exe)。
当发布产品时,只需要发布这个可执⾏⽂件,并不需要发布被使⽤的静态库。
“动态链接” 是指 Windows 的链接过程,在这个过程中它把模块中的函数调⽤与在库模块中的实际函数链接在⼀起。
动态库:在使⽤动态库时,往往提供两个⽂件:⼀个导⼊库(.lib,⾮必须) 和⼀个(.dll)⽂件。
导⼊库和静态库本质上的区别:静态库本⾝就包含了实际执⾏代码和地址符号表等数据。
⽽对于导⼊库⽽⾔,其实际的执⾏代码位于动态库中,导⼊库只包含了地址符号表等,确保程序找到对应函数的⼀些基本地址信息。
动态链接库的标准扩展名是(.dll)。
只有扩展名为(.dll)的动态链接库才能被 Windows 操作系统⾃动加载。
如果该⽂件有另外的扩展名,则程序必须明确地⽤ LoadLibrary() 或 LoadLibraryEx() 加载相应模块。
编写动态链接库我们编写的程序都可以根据 UNICODE 标识符的定义编译成能够处理 UNICODE 或者⾮ UNICODE 字符串的程序。
在创建⼀个 DLL 时,对于任何有字符或者字符串参数的函数,它都应该包括 UNICODE 和⾮ UNICODE 两个版本。
dll是什么文件格式?.dll文件怎么打开?
dll是什么文件格式?.dll文件怎么打开?
dll是什么文件格式?.dll文件怎么打开?dll是什么文件dll文件是系统的动态链接库文件,DLL是一个包含可由多个程序同时使用的代码和数据的库。
DLL文件对于电脑运行很重要,万一缺了某个DLL文件,可能会导致某些软件或程序无法启动。
dll是Dynamic Link Library的缩写,意为动态链接库。
DLL文件一般被存放在C:WindowsSystem目录下。
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。
当我们执行某一个程序时,相应的DLL文件就会被调用。
一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。
dll文件怎么打开?工具Reflector步骤1:下载Reflector绿色版,解压,可找到文件Reflector, 步骤2:双击运行Reflector
步骤3:选择DLL对应的版本,确定下一步
步骤4:左上角工作栏,File->Open Assembly;打开你所需要打开的dll文件
步骤5:在软件左边工作区域我们就可以看到你所打开的dll文件,点击展开,在所选择的.dll文件下面可以看到dll中所有的编写的类,
步骤6:点击类名我们就可以看到里面编写的内容了。
lib是什么文件格式?.lib文件怎么打开?
lib是什么文件格式? .lib文件怎么打开?
lib文件是库文件,与DLL文件相类似,是C生成的目标文件,如果你要调用别人编译好的函数,就要用到LIB文件 比如 #include lib是什么文件? lib文件有两种,一种是静态库,静态库,一般在编程序的软件里才带有的库文件。另一种当然是动态库了,这种库文件,是主 要供其它程序调用的,直接打不开。
lib文件如何打开? lib文件需要借助VB、PB等软件才能打开,或者用编程语言来打开,当然VC自带的dumpbin或者直接任意商业的反汇编工具 如IDA,w32dasm也是可以的。
相信大家对lib文件有了更深的了解,在日常使用lib文件过程中会更加得心应手。
பைடு நூலகம்
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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文件必须随应用程序一起发行,否则应用程序将会产生错误。
一、开发和使用dll需注意三种文件1、 dll头文件它是指dll中说明输出的类或符号原型或数据结构的.h文件。
当其它应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
2、 dll的引入库文件它是dll在编译、链接成功后生成的文件。
主要作用是当其它应用程序调用dll时,需要将该文件引入应用程序。
否则,dll无法引入。
3、 dll文件(.dll)它是应用程序调用dll运行时,真正的可执行文件。
dll应用在编译、链接成功后,.dll文件即存在。
开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,不必有.lib文件和dll头文件。
动态链接库 (DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个 DLL 副本的内容。
动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。
在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。
使用动态链接代替静态链接有若干优点。
DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。
lib与dll文件最大区别在调用方面dll可以静态陷入lib与DLL从这一章起,我讲述的内容将特定于windows平台。
其实这篇文章也可看作是我在windows下的开发经验总结,因为以后我决定转unix了。
前面有一章说编译与链接的,说得很简略,其实应该放到这一章一块儿来说的。
许多单讲C++的书其实都过于学院派,对于真实的工作环境,上百个源文件怎么结合起来,几乎没有提及。
我引导读者一步步看看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.cppvoid ShowHello();//[1]int main(){ShowHello();return 0;}// hello.cpp#include <stdio.h>void ShowHello(){printf("Hello World!\n");}将这两个文件加入到一个VC工程中,它们会被分别编译,最后链接在一起。
在VC编译器的输出窗口,你可以看到如下信息--------------------Configuration: hello - Win32 Debug-------------------- Compiling...main.cpphello.cppLinking...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.lib2 可以在源代码中加入一行指令#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工程时由编译器生成。
涉及到DLL,问题开始复杂起来,我不指望在本文中能把DLL的原理说清楚,这不是本文的目标,我介绍操作层面的东西。
简单的说,一个DLL工程和一个EXE工程的差别有两点:1 EXE的入口函数是main或者WinMain,而DLL的入口函数是DllMain2 EXE的入口函数标志着一段处理流程的开始,函数退出后,流程处理就结束了,而DLL 的入口函数对系统来说,只是路过,加载DLL的时候路过一次,卸载DLL的时候又路过一次[2],你可以在DLL入口函数中做流程处理,但这通常不是DLL的目的,DLL的目的是要导出函数供其它DLL或EXE使用。
你可以把DLL和EXE的关系理解成前面的main.cpp 和hello.cpp的关系,有类似,实现手段不同罢了。
先看如何写一个DLL以及如何导出函数,读者应该先尝试用VC创建一个新的动态链接库工程,创建时选项不选空工程就可以了,这样你能得到一个示例,以便开始在这个例子基础上工作。
看看你创建的例子中的头文件有类似这样的语句:#ifdef DLL_EXPORTS#define DLL_API __declspec(dllexport)#else#define DLL_API __declspec(dllimport)#endif这就是函数的导出与使用导出函数的全部奥妙了。
你的DLL工程已经在工程设置中定义了一个宏DLL_EXPORTS,因此你的函数声明只要前面加DLL_API就表示把它导出,而DLL 的使用者由于没有定义这个宏,所以它包含这个头文件时把你的函数看作导入的。
通过模仿这个例子,你就可以写一系列的标记为导出的函数了。
导出函数还有另一种方法,是使用DEF文件,DEF文件的作用,在现在来说只是起到限定导出函数名字的作用,这里,我们要引出第二种[4]使用DLL的方法:称为显示加载,通过Windows API的LoadLibrary和GetProcAddress这两个函数来实现[5],这里GetProcAddress的参数需要一个字符串形式的函数名称,如果DLL工程中没有使用DEF 文件,那么很可能你要使用非常奇怪的函数名称(形如:?fnDll@@YAHXZ)才能正确调用,这是因为C++中的函数重载机制把函数名字重新编码了,如果使用DEF文件,你可以显式指定没编码前的函数名。
有了这些知识,你可以开始写一些简单的DLL的应用,但是我可以百分之百的肯定,你会遇到崩溃,而之前的非DLL的版本则没有问题。
假如你通过显式加载来使用DLL,有可能会是调用约定不一致而引起崩溃,所谓调用约定就是函数声明前面加上__stdcall __cdecl 等等限定词,注意一些宏如WINAPI会定义成这些限定词之一,不理解他们没关系,但是记住一定要保持一致,即声明和定义时一致,这在用隐式加载时不成问题,但是显示加载由于没有利用头文件,就有可能产生不一致。
调用约定并不是我真正要说的,虽然它是一种可能。
我要说的是内存分配与释放的问题。
请看下面代码:void foo(string&str){str = "hello";}int main(){string str;foo(str);printf("%s\n", str.c_str());return 0;}当函数foo和main在同一个工程中,或者foo在静态库中时,不会有问题,但是如果foo 是一个DLL的导出函数时,请不要这么写,它有可能会导致崩溃[6]。
崩溃的原因在于“一个模块中分配的内存在另一个模块中释放”,DLL与EXE分属两个模块,例子中foo里面赋值操作导致了内存分配,而main中return语句之后,string对象析构引起内存释放。