两个月后才更新一篇。。。。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文件编译生成的。在编译这种静态库工程时,根本不会遇到链接错误;即使有错,也只会在使用这个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 <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)工程目录

(3)Windows系统目录

(4)Windows目录

(5)列在Path环境变量中的一系列目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 05:10:40

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

当小学一年级班主任两个月后的感慨

时间真快,担任小学班主任已经两个月了.没想到这么快,就在这一周,我崩溃了. 崩溃的原因有很多期中考试无形中增加了我的压力这是自然,担任两个班的教学压力大这是自然,事情繁重,忽然间又要汇报STEAM项目,让我无限的惆怅这是第二大原因,也是主要原因.正因为如此,班里的事情让我无限的头疼,无限的头疼,甚至于开始不停的发火,伤及了无辜. 有的时候也是很自责,为什么要这个样子,感觉自己这个样子很丑陋. 我更多应该控制自己的情绪,不加以控制和调节,生活只会这样,不停的一地鸡毛下去,永远到不了头. 曾经说过,

学习python两个月后,用了一个月用django写的物资管理系统

2017年5月,因为工作需要,单位急需一套物资管理系统来实现无纸化办公,当时也找外部门懂计算机编程的写过一套,用c(#)写的,因为是外单位做的,有很多细节无法满足工作需要,如果再进行改动,可能要重新做.求人不如靠自己,当时自己就有了一个想法,我要自己编写,或许只是一时的冲动,但如果做成了,确实能提升我在单位的自我价值.在此之前,我完全没有编程基础,只是在上中专的时候简单的学习过c语言,但那个时候已经是将近20年的事情了,编程在我脑子里完全没有概念.抱着试试看的态度,我决定开始学习.       

网络工程师成长日记139-试两个月行不行

这是我的第139篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 中午有一名咨询者过来,跟我聊了好一会儿,他一来他就说他想培训,他愿意接受培训,想从事技术这个行业 我先了解了一下他的背景, 他是15年毕业,家就是本地的,但是在海南呆了两年,在海南这两年期间,主要是在三亚的一个酒店,从事,行政,还有救生员的工作,其实和技术没有任何关系 我说那你以后想做的是什么岗位呢?对未来有什么打算?他的回答主要就是想做技术类的岗位,想找有,发展前途的,刚开始是可以接受3000块钱的工资,但是后期一

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

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

提取从当天起,后两个月生日人员名单

if object_id('tempdb..#tt')>0 drop table #tt --模拟数据 create table #tt (cc datetime)insert into #tt values('2013-02-01')insert into #tt values('2013-05-16')insert into #tt values('2013-05-21')insert into #tt values('2013-06-01')insert into #tt values('

DataGridView编辑后立即更新到数据库的两种方法

DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据.最近在做一个迷你超市管理系统,要大量用到这个控件.所以花时间好好研究了下. 这是迷你超市管理系的库存数据DataGridView,用户一定会想如果能直接在DGV中修改数据就好了. 是的,这是一个很好的想法,这个功能微软早就帮我们想到了,现在可以使两种方法加以实现.下面就来介绍一下他们. 第一张方法:基于DataAdapter对象创建一个CommandBulider,用

入职互联网行业两个月

文件夹:一,心得体会:二,个人经历. 先把心得体会放出来:1.沟通:要明确老板给你这个任务想达到什么效果(意图),deadline(时间节点),老板本来有什么想法. 2,逻辑:开发一个产品.全部功能点都能形成闭环.使用端.提供内容端,管理端. ----------------------------仅仅看总结怎么能体会??----------------------------------- 工作两个月之后,最终体会到,每个职位,进入前和真实进去.全然是不同的两回事. (哈哈,就像选专业,你在门

两个月的php学习我学了些什么

在lovo学习php已经两个月了,这两个月自己又学会了些什么呢? 什么是php?这是刚刚开始的疑问,开始只是很模糊的理解成web服务器的后台应用程序什么的,到后来学习后才慢慢的认识了php,php的全名是HyperText Preprocessor(超文本预处理器),最开始发明者的目的是用来处理自己的个人主页的,因此php最开始是代表Personal Home Page,发展至今,php不在是简单的处理服务器端的脚本程序了(例如:从表单中收集资料:产生动态的网页内容:传送及接收cookies等)

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

前言 看到这个标题的童鞋,可能会产生两种想法: 想法一:这篇文章是标题党 想法二:Android开发越来越不景气了吗?前端越来越火了吗? 我一向不喜欢标题党,标题中的内容是我的亲身经历.我是2016年6月份毕业,第一份工作是做Android开发.2018年1月初,我辞掉了工作,从零开始,在家自学了两个月的Web前端开发,3月份开始找Web前端的工作,3月底找到工作. Android开发并非不景气,我加入了刘欣老师的知识星球「码农翻身」,他在里面说过: 如今,手机人手一部,肯定是需要APP开发,但