写在前面

自从微软推出的第一个版本的Windows操作系统以来,动态链接库(DLL)一直就是Windows操作系统的基础。

动态链接库通常不能直接运行,也不能接收消息。它们一直是独立的文件,其中包含能被可执行程序或其他DLL文件调用来完成某项工作的函数。只有在其他模块调用动态链接库中的函数时,它才能发挥作用。在实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,提供给其他程序调用。

Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL:
①Kernel32.dll
它包含用于管理内存、进程和线程的函数,例如CreateThread函数。
②User32.dll
它包含用于执行用户界面任务(如窗口的创建和消息的传递)的函数,例如CreateWindow函数。
③GDI32.dll
它包含用于画图和显示文本的函数

静态库和动态库

静态库

函数和数据被编译进一个二进制文件中(扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe文件)。当发布产品时,只需要发布这个可执行文件即可,并不需要发布被使用的静态库。

动态库

在使用动态库的时候,往往提供两个文件:一个引入库文件和一个DLL(.dll)文件。

注意:
虽然引入库文件的后缀名也是”.lib”,但该文件和静态库的”.lib”文件有着本质上的区别。

静态库的”.lib”文件包含数据和函数的声明实现,而动态库的”.lib”引入库文件则仅包含导出的函数和变量的符号名(声明),而在DLL文件中才包含实际的函数和数据。

在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将DLL映射到进程的地址空间中,然后访问DLL中的导出函数。

这时,在发布产品时,除了发布可执行文件以外,还要发布该程序将要调用的动态链接库(dll)。

动态链接库的优势

①可以采用多种编程语言来编写
我们可以采用自己数据的开发语言编写DLL,然后由其他语言编写的可执行程序来调用这些DLL。

②增强产品的功能
在发布产品时, 可以发布产品功能实现的动态链接库规范, 让使用该动态链接库的开发人员遵循这个规范开发自己的DLL, 以取代产品原有DLL, 让产品调用新的dll, 因此实现增强产品的功能.

③提供二次开发的平台
可以采用DLL的形式提供一个二次开发的平台, 让用户可以利用该DLL中已实现的功能, 封装成自己需要的符合业务需求的DLL, 实现二次开发.

④简化项目管理
在一个大型的项目中, 可以将项目细分, 将不同的功能交由各个项目小组以DLL的形式实现, 以同步协作推进项目.

⑤可以节省磁盘空间和内存
假如多个程序都会用到一个DLL, 那么加载时只会加载一次, 然后和其他进程共享, 以节省内存.

⑥有助于资源的共享
DLL可以包含对话框模板, 字符串, 图标, 位图等资源, 假如多个应用程序会用到同一个对话框模板, 或者图标等, 可以将这些对话框和图标等资源封装到一个DLL中, 以供多个程序使用.

⑦有助于实现应用程序的本地化
如果产品需要提供多种语言版本, 那么可以使用DLL来支持多语言, 可以为每种语言创建一种只支持该语言的DLL.

动态链接库的加载

隐式加载

  1. 可以在项目属性 -> 链接器 -> 附加依赖项 中输入所需动态链接库的引入库文件(.lib文件), 然后将DLL文件放到执行目录下
  2. 也可通过#pragma comment(lib, 引入库文件路径), 来隐式加载, 同时也需要将DLL文件放到执行目录下.

//注意路径, 这里会以当前文件的路径去查找Dll1.lib文件
#pragma comment(lib, "Dll1.lib")

显式加载

显式加载步骤:
①程序目录下要存在dll文件
②通过LoadLibrary函数加载
③通过GetProcAddress获取导出函数地址
④程序中通过获取到的函数指针调用接口
⑤使用完dll后通过FreeLibrary函数释放对dll的引用

小结

这里仅简单的介绍了下动态链接库的相关知识及使用, 后面会详细的介绍如何使用动态链接库, 使用时的注意事项, 如何创建自己的dll或二次开发他人的dll.

动态链接库(一)--动态链接库简介相关推荐

  1. JNative 调用动态链接库 调用动态链接库函数

    假设我有一个叫test.dll的动态库,其中有一个函数如下:     extern "C" int add(int* a,int* b,int* c,int d,char* Pic ...

  2. Linux编程简介——动态链接库

    传统方式下,库函数的链接是在编译器完成的,所有相关对象在编译的时候被整合成一个可执行文件.与此相比,我们也可以把对库函数的链接载入推迟到程序运行的时期,也就是我们所称作的动态链接. 动态链接的优点 除 ...

  3. SLAM静态编译中动态链接库问题

    0. 简介 作为ubuntu的使用者,最难过的事情就是环境的依赖和配置,其中最繁琐的就是各种动态链接库的配置.尤其是在跑ROS-SLAM等比较大的环境时候,我们会发现按照教程经常会出现安装了这个库但是 ...

  4. 静态链接库与动态链接库详解

    以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除. 一.库文件的简介 库文件,其等价为压缩包文件.该文件内部通常包含不止一个目标文件(也就是二进制文件),每个目标文件存储的代码,并非完整 ...

  5. 使用Libtool构建动态链接库 [五]

    使用Libtool构建动态链接库 [五] 文章目录 使用Libtool构建动态链接库 [五] Libtool简介 Libtool包 Libtool的选项 **--tag选项** **--mode选项* ...

  6. 静态链接库与动态链接库 (二)动态链接库的编译与使用

    上一篇文章里大概描述linux下静态链接库的编译与使用,下面讲动态链接库的编译与使用方法. 1. 什么是动态链接库 所谓动态链接库,是指编译的时候不会把程序引用到的库插入到执行程序里,而是在执行时候才 ...

  7. 静态链接库和动态链接库(转)

    我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 &quo ...

  8. Linux 下的动态链接库问题

    在 Linux 开发时,我们经常会看到一些形如 xxx.so 的名称出现,其中 so 是 Shared Object 的缩写,即可以共享的目标文件,也就是我们所称为的动态链接库,和在 Windows ...

  9. 静态链接库、动态链接库和动态加载库

    前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标 ...

最新文章

  1. AI Studio中的视觉数据集合
  2. cocoa 坑爹的委托
  3. linux dmesg信息哪来的,linux中的dmesg命令简介
  4. HDU 4406 最大费用最大流
  5. 从FTP建立连接模式想到的TCP SYNFlood防御
  6. 使用 C# + SQLite + PetaPoco + django 快速打造桌面程序
  7. Thrift中实现Java与Python的RPC互相调用
  8. jQuery 属性操作attr().prop().text().html().val()
  9. java中对于异常的处理,代码简单描述
  10. 实用常识_实用垃圾收集,第1部分–简介
  11. springcloud 使用git作为配置中心
  12. 微信小程序:配置合法域名
  13. 软工导论测试代码(归档):设备管理系统
  14. 演化博弈matlab代码,Matlab演化博弈仿真
  15. linux so 加壳,[android] 从加壳的so文件中抽出symbols
  16. iOS调用手机振动和铃声
  17. bundle包是什么意思_bundle与package区别与联系
  18. easy excel date 类型解析报错_两个日期相差多少天,你还在一天天的数吗?用Excel轻松完成计算...
  19. ios播放器相关(音乐列表获取)
  20. 电商系列(一)课程介绍

热门文章

  1. application/json 和 application/x-www-form-urlencoded 有什么区别?
  2. 爬虫:尝试通过selenium登录内部oa和IDAP系统并操作
  3. 今日资本总裁徐新:中华英才网CEO历经两次更迭
  4. 毕设设计之 ---基于python大数据分析的北上广住房数据分析
  5. 不学习的日子感觉很的空虚
  6. 去掉button默认样式
  7. JavaScript 动画库
  8. word如何在文中添加参考文献的引用并自动更新
  9. JavaScript(3)-- 数据类型
  10. 学生HTML网页作业作品:HTML+CSS网站设计与实现【红色喜庆邀请函 3页】