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再次运⾏。
- 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对象析构引起内存释放。