C++中的动态链接库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++中的动态链接库
⼀,动态链接库的基本概念
1.DLL(Dynamic Linker Library)的概念
可以把DLL看做是⼀个仓库,它提供了⼀些可以直接拿来⽤的变量,函数或者类(但是不建议从DLL中获取变量),在历史的发展中,仓库经历了从“⽆库 - 静态链接库 - 动态链接库”的时代。
静态链接库(.lib)和动态链接库(.dll)都是共享代码的⽅式。
如果采⽤了静态链接库,则⽆论你愿不愿意lib中的代码指令都被直接包含进了最终⽣成的.exe程序中。
但若是使⽤了动态链接库,该DLL则不会被包含进.exe程序中,当.exe程序执⾏的时候,再“动态”的来引⽤或者卸载DLL。
2.动态链接库的特点
DLL⽂件可以被其他的语⾔所调⽤,例如C#或者Java等。
譬如Window下的存在⼤量的DLL⽂件,当我们⽤Java编写Swing界⾯或者其他语⾔如C#等都是可以进⾏调⽤的。
3.常见的动态链接库
我们在Window系统下⾯的system32⽂件夹中会看到kernel.dll、user32.dll和gdi32.dll。
Window系统下的⼤多数API都是包含在这些DLL中。
kernel.dll中的函数主要处理内存管理和进程的调度。
user32.dll中的函数主要控制⽤户界⾯。
gdi32.dll中的函数主要负责图形⽅⾯的操作。
4.静态链接库和动态链接库的调⽤说明
从上图中可以看出,静态链接库和动态链接库都是在程序的“链接”阶段进⾏调⽤的,但是静态库和动态库的链接⽅式是不⼀样的。
静态库的链接是把.lib的代码指令全部链接到最终⽣成的EXE程序中。
动态链接库的链接是只链接.dll⽂件的地址引⽤,因此⽣成的EXE程序中不包含.dll的代码指令,所以.dll⽣成的可执⾏程序要⽐.lib⽣成的⼩很多,根据实验,⼀个仅包含printf的函数的⽣成程序,在静态链接库中需要800k,⽽动态链接库只需要8k左右,可以见其差100倍。
⼆,静态库的创建和调⽤
1.静态链接库的创建
①创建⼀个Win32控制台应⽤程序
②点击下⼀步
③选择静态库应⽤程序类型,去掉预编译和安全检查后,点完成。
④项⽬创建完成后,添加MathUtils类
⑤编写MathUtils类的.h和.cpp⽂件,为打包成静态库做准备
⑥编写完成后,点击⽣成程序即可,然后在Debug⽬录下就会出现.lib程序
2.静态链接库的调⽤
①按照上⾯的⽅式再创建⼀个项⽬,这⾥起名为TestLibDemo,注意这⾥的程序类型是控制台应⽤程序。
然后编写main.cpp⽂件。
②静态连接库的调⽤需要引⼊.h⽂件和.lib⽂件,因此我们把上⾯创建的MathUtils项⽬⾥的MathUtils.h和MathUtils.lib⽂件复制到TestLibDemo项⽬的⽂件夹下⾯,lib⽂件放在lib⽂件夹下
③在main.cpp中引⼊MathUtils.h头⽂件,并编写测试⽤例
④我们发现我们可以调⽤这些⽅法,但是却⽆法创建,这是因为我们只引⼊了头⽂件,并没有指定lib⽂件的位置和要链接的lib⽂件,所以需要我们在程序“链接”过程中将.lib⽂件包含到程序中。
⾸先选中项⽬后右击项⽬点击“属性”,在“链接器 - 常规 - 附加库⽬录”这个选项⾥,将我们放置lib⽂件的⽬录指定出来。
然后点击“输⼊ - 附加依赖项”将MathUtils.lib添加进⼊就可以了。
⑤然后再重新运⾏测试程序就可以执⾏了
⑥还有⼀种⾮配置项⽬的⽅式链接lib⽂件,我们在配置好lib⽂件所在的⽬录后,可以在代码中指定要引⼊的静态库⽂件,但是要先把上⾯的附加依赖项⾥已经引⼊的lib⽂件去掉。
3.静态链接库的总结
在创建静态连接库的时候,需要注意要创建的是静态库程序,⽽⾮其他应⽤程序。
在调⽤静态链接库的时候,需要准备的是头⽂件(.h)和静态库⽂件(.lib),缺⼀不可。
然后把头⽂件和静态库⽂件放到项⽬的⽬录下,在编辑器中,在测试项⽬的链接器的输⼊栏中,指定要加载lib⽂件的⽬录。
在引⽤lib的时候有两种,⼀种是编辑器⽅式设置,另⼀种是在代码中设置。
三,动态链接库的创建和调⽤
1.动态链接库的创建
①新建项⽬,这⾥的应⽤程序类型选择dll程序,选择导出符号,这样会默认为我们创建模板。
②创建完成后的项⽬给我们包含了⽰例代码,包含了导出变量,导出函数,导出类。
③我们⽣成项⽬,就可以在项⽬下找到MyDLL.dll这个动态链接库⽂件。
2.动态库的调⽤
①我们新创建⼀个项⽬,名称为TestDLL,因为.dll是在运⾏时动态加载,所以需要把上⼀步产⽣的.dll⽂件拷贝到该运⾏程序的⽬录下。
②加载动态库,并获取动态库的函数的地址,并调⽤。
3.动态库的创建和调⽤总结
动态库的创建就是使⽤__declspce(dllexport)指令来进⾏导出,然后将该定义好的宏放到函数,变量或者类的前⾯,在预编译阶段,将宏进⾏替换。
注意⼀点的是,我们在调⽤动态库的函数时候,通常会加上extern "C"这个指令,因为c++代码的函数有重载,会把函数的名称进⾏重新的替换,我们在加载动态库的时候倘若有重载就会找不到该函数,所以我们希望c++的函数以c的风格进⾏⽣成,就不会产⽣该问题。
dllmain.cpp是dll ⽂件的⼊⼝程序,主要处理多个.dll⽂件的时候⽤到,这⾥⼀般⽤不到。
动态库的调⽤我们采⽤的灵活的⽅式进⾏动态的“加载”和“卸载”,需要先引⽤window的API,不要忘记释放动态库。
(动态的载⼊变量和类还不会...).。