共同拥有两种库:

一种是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();   //dll中的函数。在DllSample.h中声明

);

}

(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();

        std::cin.get();

        FreeLibrary(hInstLibrary);

        );

}



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环境变量中的一系列文件夹

两个月后才更新一篇。。。。LIB和DLL的差别的更多相关文章

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

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

  2. 程序员被老板要求两个月做个APP,要不比京东差,网友:做一个快捷方式,直接链到京东

    隔行如隔山,这句话说得一点都没错.做一个程序员,很多人都会羡慕,也有很多人会望而却步. 作为一个外行人,你别看程序员每天坐在电脑前敲敲键盘打打代码,以为很简单,其实啊也只有程序员自己明白,任何一个看似 ...

  3. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

    代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...

  4. 两个月刷完Leetcode前400题经验总结

    更新:气死了,挂个傻逼: 每次做个分享.组织个活动,就会有一些傻逼冒泡生怕别人不知道他是傻逼,气死我了!自己好好看看非法集资的概念,我办这个活动,一分钱都没收,入群99元是督促大家完成刷题任务,最后完 ...

  5. iPhone被盗后怎么?这篇文章只办针对iOS7后的系统

    中午准备去吃饭的时候,今天看到Tungbaby的手机被盗后怎么做?http://www.jianshu.com/p/f13f49cd9b90 碰巧我的手机也被盗了.就来分享下我的经验吧.由于我当时是在 ...

  6. 裸辞两个月,海投一个月,从Android转战Web前端的求职之路

    前言 看到这个标题的童鞋,可能会产生两种想法: 想法一:这篇文章是标题党 想法二:Android开发越来越不景气了吗?前端越来越火了吗? 我一向不喜欢标题党,标题中的内容是我的亲身经历.我是2016年 ...

  7. 怎样两个月完成Udacity Data Analyst Nanodegree

    在迷恋数据科学很久后,我决定要在MOOC网站上拿到一份Data Science的证书.美国三个MOOC网站,Udacity上的课程已经被分成了数个nanodegree,每个nanodegree都是目前 ...

  8. JavaScript时间处理之几个月前或几个月后的指定日期

    在平常项目开发过程中,经常会遇到需要在JavaScript中处理时间的情况,无非两种(1,逻辑处理  2,格式转换处理).当然要说相关技术博,园子里闭着眼睛都能抓一把,但是我要做的是:既然有幸被我碰到 ...

  9. 两个月的Java实习结束,继续努力

    前言 只有光头才能变强 2018年8月30日,今天我辞职了.在6月25号入职,到现在也有两个月时间了. 感受: 第一天是期待的:第一次将项目拉到本地上看的时候,代码很多,有非常多的模块,模块下又有da ...

随机推荐

  1. hibernate 批量抓取

    使用场景: 是查询出来一个集合,然后又查询每个集合对象中的集合.使用set标签中的batch-size属性实现. 数据库中只有5个区道信息: 设置batch-size=”5”,执行的查询语句如下: 而 ...

  2. cce - 控制台中文环境

    语法 (SYNTAX) cce [-e program] 描述 (DESCRIPTION) 该程序是一个类似于 WZCE , yact 和 chdrv 的控制台中文平台.进入该环境后可以用“空格 + ...

  3. python 双冒号

    Python序列切片地址可以写为[开始:结束:步长],其中的开始和结束可以省略 1.range(n)生成[0,n)区间整数 range(10) [0,1,2,3,4,5,6,7,8,9] 2.开始st ...

  4. VC++线程函数内怎么调用外部函数

    VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.

  5. phphstrom改变项目中文件排列方式

    1.View>Tool Win dows>Project 效果图: 2.File->settings (Ctrl+Alt+S)-> Editor->General-> ...

  6. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  7. 笔试算法题(38):并查集(Union-Find Sets)

    议题:并查集(Union-Find Sets) 分析: 一种树型数据结构,用于处理不相交集合(Disjoint Sets)的合并以及查询:一开始让所有元素独立成树,也就是只有根节点的树:然后根据需要将 ...

  8. 零基础入门学习Python(28)--文件

    知识点 Python中使用open(...)这个内置函数来打开文件,并返回文件对象 open()函数参数说明: open(file, mode='r', buffering=-1, encoding= ...

  9. Shader Wave

    Shader Wave 一.原理 1. 采用 UV 坐标为原始数据,生成每一条波浪线. 2. 使用 Unity 的 Time.y 作为时间增量,动态变换波形. 二.操作步骤 1. 首先使用纹理坐标生成 ...

  10. swift -从相册中选择照片并上传

    选择本地图片并上传是应用开发中一个比较常见的功能.        原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/det ...