静态库与动态库编程.ppt
《静态库与动态库编程.ppt》由会员分享,可在线阅读,更多相关《静态库与动态库编程.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、静态库与动态库编程静态库与动态库编程主讲人:阙海忠 (Skin+作者、DirectUI首席架构师、UIPower CEO)第一节:前言第一节:前言什么是库什么是库 库从本质上来说是一种代码重用的方式,即预先编译为可执行代码的二进制格式,可以被载入内存中执行。比如我们熟悉的c运行库,里面就实现了很多基本的函数,我们无需再自己写一遍,直接调用接口使用即可,库分静态库和动态库两种。2第一节:前言第一节:前言静态库和动态库的区别静态库和动态库的区别1.静态函数库静态函数库 这类库的名字一般是xxx.lib;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而
2、易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。3第一节:前言第一节:前言2.动态函数库动态函数库 这类库的名字一般是xxx.dll(也可以包含xxx.lib用于编译时候的链接处理,也可以不包含,直接动态调用,后面会讲区别);相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库
3、。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。4第二节:静态函数库第二节:静态函数库建立静态库工程建立静态库工程建立静态库工程:我们从最简单的开始,先建立一个win32的静态库工程,先新建工程,选择WIN32项目5第二节:静态函数库第二节:静态函数库我们创建一个testlib工程6第二节:静态函数库第二节:静态函数库7第二节:静态函数库第二节:静态函数库在“应用程序类型”选择选择静态库8第二节:静态函数库第二节:静态函数库 点完成之后我们会得到一个空白的新工程,勾选预编译头会自动生成stdafx.h,stdafx.cpp当然我们也可以不勾选。预编译的头的作用就不多说了,主要
4、目的是为了获得更快的编译速度。9第二节:静态函数库第二节:静态函数库添加静态库相关类添加静态库相关类我们如果需要提供一个类,那么最简单的,先在工程右键添加一个C+类,我们起名为CTestLib10第二节:静态函数库第二节:静态函数库 之后我们获得一个CtestLib的类,我们打开TestLib.h添加一个最简单的接口,做加法处理的,叫int Add(int a,int b)返回的值是a+b的结果11打开TestLib.h添加Add接口第二节:静态函数库第二节:静态函数库我们打开TestLib.cpp在CPP文件里面我们做Add的实现12第二节:静态函数库第二节:静态函数库可能有人会问,Add的
5、实现为什么不可以放.h里面呢?比如在.h里面写 13其实这是可以的,语法上没问题,但是这样就违背了一些初衷,比如我们不想把函数的具体实现暴露给库的使用者,只希望他们能使用接口来操作就行了,不关心实现细节第二节:静态函数库第二节:静态函数库添加静态库相关接口添加静态库相关接口对于要实现单独的接口,同样很简单,比如我们要实现一个全局的减法接口,比如int Sub(int a,int b);我们同样可以实现,为了最大范围的保证兼容,我们使用extern“C”关键字声明,同样的,我们为了演示方便,把接口也写在TestLib.h里14或者我们可以这样写:把所有需要实现的接口都写在extern“C”的括号
6、内第二节:静态函数库第二节:静态函数库在CPP里实现并无区别,我们如下写Sub即可15之后我们编译一下,在输出目录得到Testlib.lib这个就是我们编译好的静态库文件了第三节:使用静态库第三节:使用静态库对于上一节我们编译得到的库文件如何使用呢?因为我们在静态库提供的接口文件是TestLib.h,所以我们要用到的(对外发布的)就是TestLib.h和编译出来的TestLib.lib接下来我们再新建一个工程,为了最简化,我们建立一个控制台应用程序testexe16第三节:使用静态库第三节:使用静态库在应用程序类型选择控制台程序17第三节:使用静态库第三节:使用静态库有多种方式使用这样的Lib
7、,如果我们在同一个工作区来使用这个库,那么我们就可以在新建的工程里面设置依赖项目,这样系统会自动的为我们连接这个库文件,我们只需要包含一下提供静态库函数接口的.h文件即可。我们现在先假设这个静态库是单独发布给其他人用的,那么我们可以设置静态库和.h的目录,添加到VC工程的目录配置,这样就可以和使用系统库一样的使用了,另外我们为了演示方便,先把库文件放到testexe工程下面18第三节:使用静态库第三节:使用静态库我们在Testexe工程右键添加现有项把TestLib.h给加进工程19第三节:使用静态库第三节:使用静态库我们打开testexe.cpp写上相关代码20编译,这时候我们会得到一些链接
8、错误:1testexe.obj:error LNK2019:无法解析的外部符号public:_thiscall CTestLib:CTestLib(void)(?1CTestLibQAEXZ),该符号在函数_wmain 中被引用1testexe.obj:error LNK2019:无法解析的外部符号public:int _thiscall CTestLib:Add(int,int)(?AddCTestLibQAEHHHZ),该符号在函数_wmain 中被引用1testexe.obj:error LNK2019:无法解析的外部符号public:_thiscall CTestLib:CTestLi
9、b(void)(?0CTestLibQAEXZ),该符号在函数_wmain 中被引用第三节:使用静态库第三节:使用静态库因为我们只包含了接口,还没包含库文件,所以我们需要手动添加库文件第一个方法:我们右键点击testexe工程属性,打开属性页面板,选到链接器选项21第三节:使用静态库第三节:使用静态库点开链接器左边的加号,选到输入22第三节:使用静态库第三节:使用静态库附加依赖项里面我们输入TestLib.lib23第三节:使用静态库第三节:使用静态库点确定24第三节:使用静态库第三节:使用静态库再次编译程序,就顺利生成我们的执行程序了运行结果如下:25第三节:使用静态库第三节:使用静态库这就
10、是我们实现的一个最简单的功能,以此推广,无论多复杂的库都可以这样来做刚才我们说到使用静态库,还可以直接在代码里面这样写:26通过写显式链接的代码#pragma comment(lib,“TestLib.lib”)这样能显式的要求添加TestLib.lib到工程里面进行连接编译结果一样顺利通过,运行结果一样就不重复了第四节:动态库第四节:动态库相对于静态库,动态库的形式更灵活一些,大多情况下,我们编译动态库的时候,除了获得dll文件,依然会得到.lib文件,大多情况下,接口的定义还是需要通过.h来做,那么和静态库的工程,编译到底有多大区别呢?我们就来实际的通过建立动态库工程的例子再来慢慢讲述一下
11、动态库27第四节:动态库第四节:动态库新建一个工程TestDll28第四节:动态库第四节:动态库在应用程序设置里面,应用程序类型选到DLL然后完成 29第四节:动态库第四节:动态库我们得到这样一个项目 30第四节:动态库第四节:动态库Stdafx.h,stdafx.cpp依然是预编译头的相关文件,不用管,testdll.cpp里面为我们实现了一个DllMain函数 31第四节:动态库第四节:动态库很简单的只是返回一个TRUE的处理,我们先来讲述一下DllMain的作用。前面说过,动态库dll和静态库最大的区别就是,动态库是可以独立运行的文件,通俗一点讲,和可执行文件没有太大的本质区别,所以当其
12、他可执行文件(exe或者其他dll)调用到该dll的时候,系统会执行一个入口函数,做一些初始化之类的工作,当然这个入口函数和可执行文件exe有一个最大的区别就是这个入口函数不是必须的,也就是说没有这个入口函数依然能编译dll下面我们简单的先说一下系统会何时调用这个入口函数DllMain的第二个参数fdwReason指明了系统调用Dll的原因,它可能是::DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH。以下从这四种情况来分析系统何时调用了DllMain。32第四节:动态库第四节:动态库DLL_PR
13、OCESS_ATTACH大家都知道,一个程序要调用Dll里的函数,首先要先把DLL文件映射到进程的地址空间。要把一个DLL文件映射到进程的地址空间,有两种方法:静态链接和动态链接的LoadLibrary或者LoadLibraryEx。当一个DLL文件被映射到进程的地址空间时,系统调用该DLL的DllMain函数,传递的fdwReason参数为DLL_PROCESS_ATTACH,这种调用只会发生在第一次映射时。如果同一个进程后来为已经映射进来的DLL再次 调用LoadLibrary或者LoadLibraryEx,操作系统只会增加DLL的使用次数,它不会再用DLL_PROCESS_ATTACH调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 静态 动态 编程
限制150内