`

【C++ Primer】静态链接库(lib)和动态链接库(dll)的区别和使用

 
阅读更多

如果对Linux下静态链接库和动态链接库感兴趣,请狂点击 -->大笑你懂的

一,概念

1)静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。

   使用方法
  
   1> 格式如:#pragma comment(lib,"XXX.lib")
   2> 针对开发环境:
   1、如果使用VC,可以在Project Setting-->Link中加入你的静态库,也可以直接把该.lib文件加入到你的工程中
  2、如果使用Visual Studio,位置在 项目→配置属性→连接器→输入→附加依赖项 中加入.lib文件
   构造方法

在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.lib),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行

编程使用:使用lib需注意两个文件:

(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).lib文件,见上面。

2)Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

DLL举例

ActiveX 控件(.ocx) 文件:示例是日历控件,它使您可以从日历中选择日期。 ·

控制面板(.cpl) 文件 :cpl 文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL。

  · 设备驱动(.drv) 文件

编程使用;

使用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。

二,初步认识


共有两种库:
一种是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的方法:
静态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头文件。



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



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环境变量中的一系列目录

分享到:
评论

相关推荐

    C++Primer 习题解答(第4版)--绝对完整版

    8. **命名空间与链接**:C++ Primer 习题解答也会涉及命名空间的使用,避免全局名字冲突,并介绍静态库与动态库的链接问题。 9. **C++11及后续标准的新特性**:由于本书对应的是第四版,因此会包含C++11及其后续...

    C++Primer Plus附录源码等文件.zip

    《C++ Primer Plus》是Stephen Prata撰写的一本广受欢迎的C++编程教材,第六版提供了深入浅出的C++语言教程,旨在帮助初学者和有一定经验的程序员掌握这一强大的编程语言。附录中的源码文件是作者为配合书中的教学...

    c++ primer plus 答案 c++ primer plus 答案

    理解指针的动态内存分配和解引用,以及引用的初始化和使用是学习C++的重要环节。 3. **函数**:学习如何定义和调用函数,包括参数传递、函数返回值、重载函数以及递归函数。 4. **类与对象**:C++的核心是面向对象...

    C++ primer中文版-高清-带目录

    《C++ Primer中文版》是一本为初学者设计的C++编程教材,旨在帮助读者深入理解和掌握C++语言。这本书的高清版本提供了清晰的文本和图表,使得阅读体验更佳,尤其适合长时间学习和查阅。目录的存在使得学习者能够快速...

    C++ Primer编程习题集(第5版).pdf

    C++ Primer编程习题集(第5版),有习题和编程代码,供自我检验使用

    C++ Primer(Fifth Edition)(英文版+中文版)

    《C++ Primer (Fifth Edition)》是C++编程领域的一部经典著作,由Lippman、Lajoie和 Moo三位作者共同编写。这本第五版的书籍是为那些希望深入理解和掌握C++语言的程序员准备的,无论是初学者还是经验丰富的开发者,...

    C++Primer习题集第五版 pdf

    习题集 【中图法分类号】TP312-44 【内容提要】 C++Primer(FifthEdition)由三位C++大师StanleyB.Lippman、JoséeLajoie和BarbaraE.Moo合作完成,其中文译本《C++Primer中文版(第5版)》也已出版。与上一版相比,本书...

    c++ primer有目录pdf第五版本5th

    《C++ Primer》是有名的C++编程教材,其第五版(5th Edition)深入浅出地介绍了C++语言的基础知识以及C++11新标准的特性。这本书由Lippman、Lajoie和 Moo三位作者共同编写,是C++初学者和进阶者的重要参考书籍。 1....

    C++Primer课程详细视频讲解

    该视频是关于C++ Primer 这本书的猎豹详细视频初级高级讲解 该视频是关于C++ Primer 这本书的猎豹详细视频初级高级讲解 该视频是关于C++ Primer 这本书的猎豹详细视频初级高级讲解 该视频是关于C++ Primer 这本书的...

    C++ Primer第四版【中文高清扫描版】.pdf

    《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...

    C++primer第四版源代码

    2. **指针与引用**:C++中的指针是内存地址的别名,而引用是另一个变量的别名,它们在内存管理中起到关键作用,尤其是在动态内存分配和函数参数传递时。 3. **类与对象**:C++的核心是面向对象编程,类是定义对象...

    c++primer高清中文版-第5版.zip

    C++是一门强大、难学、令人痛苦,但又是如此美妙的编程语言,在工业界和学术界都可以使用,《C++ Primer(第5版)》即针对初学者,也同样适用于有一定编程经验的读者,第5版配备了C++11新标准,是C++粉丝们书架上...

    c++ primer 第5版 英文版 原版精美排版 mobi格式 kindle直读

    《C++ Primer》是C++编程领域的一本经典著作,第五版更是深受程序员喜爱的教程。这本书详尽地介绍了C++语言,从基础语法到高级特性,为读者提供了全面而深入的学习路径。作为英文版,它保持了原汁原味的专业表达,...

    C++ primer Plus的pdf资源

    C++ primer Plus的pdf资源

    C++primer中文第五版

    《C++ Primer 中文第五版》是一本深受程序员喜爱的C++学习书籍,它全面而深入地介绍了C++编程语言的各个方面。这本书以其清晰的解释、丰富的实例和实用的建议,成为了初学者和有经验的程序员提升C++技能的重要参考...

    C++ Primer 5th 英文高清版 (带完整目录)

    《C++ Primer 5th》是C++编程领域的一部权威著作,由Lippman、Lajoie和 Moo三位专家合著。这本书以其深入浅出的讲解方式和丰富的实例,深受程序员们的喜爱。5th版更是针对C++11、C++14和C++17标准进行了全面更新,...

    C++ primer 4th Edition 英文版

    3. **标准库篇**:讲解了C++标准库的使用,包括容器(如vector、list和map)、算法、迭代器和字符串等。这些工具极大地提升了代码的效率和可读性,也是实际项目中不可或缺的部分。 4. **高级篇**:涵盖了更高级的...

Global site tag (gtag.js) - Google Analytics