zoukankan      html  css  js  c++  java
  • 动态链接库

    动态链接库

    一,动态链接库的基本概念

    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,不要忘记释放动态库。(动态的载入变量和类还不会...).
  • 相关阅读:
    饿了么P7级前端工程师进入大厂的面试经验
    前端程序员面试的坑,简历写上这一条信息会被虐死!
    这次来分享前端的九条bug吧
    移动端开发必会出现的问题和解决方案
    创建一个dynamics 365 CRM online plugin (八)
    创建一个dynamics 365 CRM online plugin (七)
    创建一个dynamics 365 CRM online plugin (六)
    创建一个dynamics 365 CRM online plugin (五)
    使用User Primary Email作为GUID的问题
    怎样Debug Dynamics 365 CRM Plugin
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6618305.html
Copyright © 2011-2022 走看看