`
aspnetwinform
  • 浏览: 89848 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

windows下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"

#pragmacomment(lib,
"DLLSample.lib")//你也可以在项目属性中设置库的链接

intmain()
{
TestDLL(
123);//dll中的函数,在DllSample.h中声明
return(1);
}

(2)显式链接
需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)。

#include<iostream>
#include
<windows.h>//使用函数和某些特殊变量
typedefvoid(*DLLFunc)(int);
intmain()
{
DLLFuncdllFunc;
HINSTANCEhInstLibrary
=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环境变量中的一系列目录


来自:http://www.cppblog.com/amazon/archive/2009/09/04/95318.html



分享到:
评论

相关推荐

    vs2010下lib和dll文件的使用

    VS2010下lib和dll文件的使用 在 VS2010 中,lib 文件和 dll 文件是两个常用的文件类型,分别用于静态链接和动态链接。下面将详细介绍这两种文件的生成和使用方法。 lib 文件 lib 文件是一种文件后缀,是 Windows ...

    lib 和 dll 封装及使用

    本文将重点介绍 lib 和 dll 在 C++ 项目中的封装与使用方法,以帮助初学者更好地理解和掌握这些技术。 #### 二、静态库(lib) 静态库是一种编译后的库文件,它包含了一些预编译好的函数或类的对象文件集合。当程序...

    windows下的glog相关编译文件libglog.dll和libglog.lib等

    libglog.dll是运行时库,libglog.lib和libglog_static.lib是链接时使用的库文件,它们的区别在于是否与目标代码静态链接。 在压缩包中,除了这三种库文件外,通常还会包含glog的头文件,这些头文件(如glog/logging...

    golang在windows平台使用zmq所需lib和dll

    放在gopath目录下,通过go get下载的资源包中,我本地目录C:\Users\wyy\go\pkg\mod\github.com\pebbe\zmq4@v1.2.7

    windows openssl dll lib

    3. 静态链接库(LIB文件):例如libeay32.lib和ssleay32.lib,这些是与DLL对应的静态链接库版本,可以在编译时与应用程序一起链接,生成不依赖外部DLL的可执行文件。 4. 可能还包含其他辅助文件,如配置脚本、示例...

    Windows中编译完成的libnet.dll lib

    在Windows操作系统环境中,开发人员有时需要使用特定的动态链接库(Dynamic Link Library,简称DLL)和静态库(Library,简称LIB)文件来扩展其应用程序的功能。`libnet.dll` 和 `libnet.lib` 是这样的一个例子,...

    boost库1.68版本windows下编译的dll和lib库

    在本案例中,我们关注的是Boost库的1.68版本,该版本已在Windows环境下使用Visual Studio 2017进行编译,并生成了用于动态链接(dll)和静态链接(lib)的库文件。 首先,我们要理解动态库(dll)和静态库(lib)的...

    windows编译SRT流媒体协议所有lib和dll以及exe等

    编译完成后,开发者可以使用生成的库文件(.lib)和动态链接库(.dll)来开发自己的SRT应用。例如,通过引用`srt.lib`,并链接`srt.dll`,可以在C++代码中调用SRT的API进行流传输。 SRT协议相比传统的RTMP协议,...

    OpenCV-4.7.0 lib 与 dll 文件

    在本文中,我们将深入探讨OpenCV 4.7.0版本,特别是与Visual Studio 2015(VS2015)相关的lib和dll文件,以及它们在C++开发中的应用。 首先,OpenCV 4.7.0是OpenCV库的一个较新版本,它提供了一系列改进和新功能。...

    x264的windows 64位版本的库包括lib和dll

    x264的windows 64位版本的库包括lib和dll,用于64位windows编解码H264 libx264.lib和libx264.dll

    GMP 库文件 for windows,包含头文件,lib,dll

    这个压缩包提供了GMP库在Windows平台上的关键组成部分,包括头文件、库文件(lib)以及动态链接库(dll)。下面将详细阐述这些组件的作用以及如何在Windows环境下利用它们进行开发。 1. 头文件(gmp.h): 头文件...

    dll文件转换为lib

    在Windows操作系统中,DLL(Dynamic Link Library)文件和LIB(Library)文件是两种常见的程序链接资源。DLL文件包含了可执行代码和数据,可供多个程序共享使用,而LIB文件则通常是静态链接库,用于编译时链接到应用...

    LibTools-Viewer1.0 windows lib dll库函数查看器

    《LibTools-Viewer1.0:Windows环境下DLL库函数查看器详解》 在软件开发过程中,尤其是涉及到系统级编程或者需要调用特定库函数时,理解库函数的使用至关重要。LibTools-Viewer1.0是一款专为Windows平台设计的...

    Windows 下预编译动态链接的 google v8 lib dll 库

    这意味着它已经与该版本的编译器兼容,并且可以方便地与使用VS2013编译的项目集成。提供的库分为两个版本,一个是针对x86(32位)系统的,另一个是针对x64(64位)系统的,这确保了不同架构下的兼容性。 动态链接库...

    MingW VC 之.a .lib .dll .def 关系

    MingW VC 之.a .lib .dll .def 关系主要涉及的是在Windows环境下,使用Microsoft Visual C++ (MSVC) 和 MinGW 工具链编译C或C++程序时,不同类型的文件及其相互关系。这里主要讲解的是库文件、动态链接库(DLL)、导...

    Dll和Lib生成及使用

    了解和熟练使用DLL和LIB对于Windows平台上的软件开发至关重要,它们可以帮助我们实现代码重用,降低存储和内存需求,提高软件的灵活性和可维护性。在实际开发中,应根据项目需求选择合适的方式生成和使用这两种库...

    win7下64位的LuaXML_lib.dll

    可以在64位的win7下使用的LuaXML_lib.dll

    DLL2LIB.zip

    在IT行业中,动态链接库(DLL)和静态链接库(LIB)是Windows操作系统下程序开发的重要组成部分。DLL文件允许多个程序共享同一段代码和数据,从而节省系统资源,而LIB文件则是与DLL相配合,提供了链接器所需的信息,...

    编译好的libssl.lib,libcrypto.lib 包含lib,dll,头文件

    1. 将dll文件放置在系统的PATH环境变量所包含的目录下,或者与可执行文件放在同一目录下,以确保运行时能找到这些依赖。 2. 在项目配置中链接对应的lib文件,确保编译器知道如何连接到OpenSSL的函数。 3. 在源代码中...

    gsl1.8Windows下的.lib文件和.dll文件(包括Release和Debug模式)

    标题 "gsl1.8Windows下的.lib文件和.dll文件(包括Release和Debug模式)" 指的是GNU Scientific Library (GSL)的1.8版本在Windows操作系统中的动态链接库(.dll)和静态链接库(.lib)文件,分别对应于Release和Debug...

Global site tag (gtag.js) - Google Analytics