两个月后才更新一篇。。。。LIB和DLL的差别


共同拥有两种库:
一种是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装载。

使用lib需注意两个文件:
(1).h头文件,包括lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,须要将该文件包括入应用程序的源文件里。
(2).LIB文件,略。

使用dll需注意三个文件:
(1).h头文件,包括dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时。须要将该文件包括入应用程序的源文件里。

(2).LIB文件。是dll在编译、链接成功之后生成的文件。作用是当其它应用程序调用dll时。须要将该文件引入应用程序,否则产生错误。假设不想用lib文件或者没有lib文件。能够用WIN32 API函数LoadLibrary、GetProcAddress装载。

(3).dll文件,真正的可运行文件,开发成功后的应用程序在公布时。仅仅须要有.exe文件和.dll文件,并不须要.lib文件和.h头文件。

使用lib的方法:
静态lib中,一个lib文件实际上是随意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这样的静态库project时,根本不会遇到链接错误;即使有错,也仅仅会在使用这个lib的EXT文件或者DLLproject里暴露出来。
在VC中新建一个static library类型的projectLib,增加test.cpp文件和test.h文件(头文件内包含函数声明)。然后编译,就生成了Lib.lib文件。

别的project要使用这个lib有两种方式:
(1)在project->link->Object/Library Module中增加Lib.lib文件(先查询工程文件夹。再查询系统Lib文件夹);或者在源码中增加指令#pragma comment(lib, “Lib.lib”)。
(2)将Lib.lib拷入project所在文件夹。或者运行文件生成的文件夹,或者系统Lib文件夹中。

(3)增加对应的头文件test.h。

使用DLL的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它仅仅是提供动态链接到DLL所须要的信息,这样的lib能够在编译一个DLLproject时由编译器生成。
创建DLLproject的方法(略)。

(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文件置入project文件夹中)。

#include <iostream>
#include <windows.h>         //使用函数和某些特殊变量
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)project文件夹
(3)Windows系统文件夹
(4)Windows文件夹
(5)列在Path环境变量中的一系列文件夹

posted on 2017-05-21 21:19 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/6886092.html

两个月后才更新一篇。。。。LIB和DLL的差别相关推荐

  1. 继在中国开设AI中心两个月后 Google这次又将一个重大研究项目转向法国

    文章来源:ATYUN AI平台 1月22日,Google宣布扩大在法国投资的计划,包括打算成立一个新的AI研究团队,这是该公司在中国开设AI中心两个月后的第二次研究计划. "我们新的研究团队 ...

  2. 4年测试经验,几经波折进了阿里,两个月后我选择了离开...

    我的情况 大概介绍一下个人情况,女,本科,家住杭州的软件测试工程师,4年多从业经验,之前在杭州中小公司.独角兽公司都待过.其实去之前对阿里价值观.氛围都还是比较了解的(在杭那么多年,而且同为互联网行业 ...

  3. 如何在两个月的时间内发表一篇EI/SCI论文-我的时间管理心得

    在松松垮垮的三年研究生时期,要说有点像样的成果,也只有我的小论文可以谈谈了.可能有些厉害的角色研究生是丰富而多彩的,而大多数的同学在研究生阶段可能同我一样,是慢悠悠的渡过的,而且可能有的还不如我,我还 ...

  4. 一个二本院校的实习生在南京实习两个月后的记录

    时间过得飞快! 转眼间,实习已经两个月了. 目前的状况就是悲伤一家的php公司要求主动办理离职. 原因其实就是很肩单:经理看我不顺眼,就跟在上学的时候班主任总会看一些学生不顺眼一样,但是唯一不同的就是 ...

  5. 20190923,两个月后的打球

    距离上次打球已经两个月了 伤病猛如虎啊 感觉左腿明显绵软无力 进攻也是右手边拼命三不沾 还好熟悉的进攻组织还在 左边的进攻也还在 慢慢会好起来的 一切都会慢慢好起来的

  6. 研究杜比视界和HDR近两个月后的各种经验和故事

    目录 播放篇 起源 问题假设 答案:3个必要条件 创作篇 先说方法 Pr.达芬奇制作杜比视界的方法 官方要求 拓展问题 1.为啥有杜比视界认证的Windows笔记本在B站看不到杜比视界选项 2.和杜比 ...

  7. 两个月后,84年工龄的财团天王也要谢幕了

    本文转载自华商韬略(id:hstl8888),作者:毕亚军 昨日,香港著名财团企业恒基兆业宣布,公司创始人.也是香港四大财团天王中唯一还在岗的李兆基,将于5月28日股东大会后卸任已由其担任了将近半个世 ...

  8. 不到两个月后,有关比特币现金升级的讨论升温

    过去几周,比特币现金的支持者一直在讨论定于今年11月15日推出的硬叉.大多数人都明白,目前有两个阵营有着完全不同的愿景.似乎在不久的将来不会出现妥协.最近,随着每一天的过去,随着时间越来越接近升级,双 ...

  9. 复旦教授发现400+安卓漏洞,最严重可使手机变砖,谷“鸽”16个月后才修复

    博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 就离谱! 去年9月向谷歌提交的400多个漏洞,一直拖到今年年底才修复完. 而且还不是一般的小漏洞,是让"市面所有活着的安卓设备变砖 ...

最新文章

  1. 碧利医疗获数千万元Pre-A轮融资,盛鼎投资、旦恩资本投资
  2. 完全背包问题 POJ1384
  3. 2017.8.12 联考题
  4. dependencies.dependency.version' for org.apache.commons:commons-math3:jar is missing
  5. SAP 电商云 Spartacus UI quick order 搜索结果的索引设置实现
  6. 新手 Spring 疑惑
  7. Windows 编程[11] - WM_SIZE 消息
  8. (转载)C#控件缩写规范
  9. anaconda 卸载_Windows安装Anaconda使用教程
  10. 使用vbs脚本实现自动化安装GUI程序
  11. 用HTML+CSS做一个漂亮简单的轻量级图片相册博客网站(web前端期末大作业)
  12. html图片与文字的排版6,HTML文字与排版
  13. 7-2 jmu-python-汇率兑换
  14. 【联机对战】一张图看懂联机对战服务
  15. [Discuz!模板] 听雨轩风格[GBK][utf8][一键安装 DIY][20110918更新]
  16. Html5游戏开发攻略(API篇)
  17. 微信小程序——简单饮食推荐(四)
  18. android AP热点(wifi热点)开发
  19. 大数据入门学习:SQL与NOSQL数据库
  20. 电商订舱哪家靠谱 广州力其

热门文章

  1. spring-注入对象list
  2. 强势的老板--项目管理
  3. thrift数据类型
  4. UIImagePikerController 浅析
  5. Word 2003高级技巧之可爱的锚标记
  6. numpy中的ogrid
  7. CocoStudio资源区导入Plist/PSD文件
  8. SAP System Copy Guide, ECC 6.0, Oracle
  9. 固态硬盘市场或将提前爆发
  10. 发现自己竟然有点恐高,郁闷