一、前言

1、代码复用是提高软件开发效率的重要途径。
2、一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。小到一个函数、一种数据类型、一个类,大到一种类、一个模块、库。
3、复用从方式上又分为“源码级别”的“白盒复用”,和“二进制级别”库的“黑盒复用”。
4、“白盒复用”的缺点大致有4点:暴露了源代码;多份拷贝,造成存储浪费;容易与程序员的“普通”代码发生命名冲突;更新功能模块比较困难,不利于问题的模块化实现。如ATL、MFC用程序框架都以源代码的形式发布的“白盒复用”。
5、“黑盒复用”一定程度上隐藏了源代码,缓解代码耦合现象。分为静态库和动态链接库。

二、静态链接库和动态链接库

1、区别:
静态链接库和动态链接库的相同点是它们都实现了代码的共享,不同点是静态链接库.ib文件中的代码被包含在调用的.exe文件中(运行时无需该lib文件),该.lib文件中不能再包含其他动态链接库或者静态链接库了。而动态链接库.dll文件可以被调用的.exe动态地“引用”和“卸载”,该.dll文件中可以包含其他动态链接库或者静态链接库。

2、制作方法

定义静态库的函数

#include "pch.h"
#include "framework.h"// TODO: 这是一个库函数示例
void fnStaticLibrary()
{}

定义动态链接库(DLL)

#include <windows.h>
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

定义具有导出项的(DLL)动态链接库
在定义动态链接库基础上增加以下代码

说明:导出项的(DLL)动态链接库会生成lib文件

//此 DLL 中的所有文件都是用命令行上定义的 DYNAMICLIBRARYEXPORT_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DYNAMICLIBRARYEXPORT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DYNAMICLIBRARYEXPORT_EXPORTS
#define DYNAMICLIBRARYEXPORT_API __declspec(dllexport)  //导出项的(DLL)动态链接库模块使用,表导出,暴露给其他模块的接口函数,类,对象。
#else
#define DYNAMICLIBRARYEXPORT_API __declspec(dllimport)  //源文件中包含此文件的任何其他项目使用,表接口函数,类,对象来自其他模块导出。
#endif// 此类是从 dll 导出的
class DYNAMICLIBRARYEXPORT_API CDynamicLibraryExport {public:CDynamicLibraryExport(void);// TODO: 在此处添加方法。
};extern DYNAMICLIBRARYEXPORT_API int nDynamicLibraryExport;DYNAMICLIBRARYEXPORT_API int fnDynamicLibraryExport(void);

4、查看动态库生成的接口
VS工具(或dependency walker):
VS2013为单击Windows图标------>所有程序------>找到相应的Visual Studio2013文件夹------->选择Visual Studio tool(会打开文件夹)-------->寻找本机工具命令提示。
VS2013为单击Windows图标------>所有程序------>找到相应的Visual Studio2017文件夹------->VS 2017的 x64_x86 交叉工具命令提示符。
切换到dll文件目录下,运行命令:dumpbin /EXPORTS 库名(例:dumpbin /EXPORTS DYNAMICLIBRARYEXPORT.dll)

三、静态链接和动态链接

1、静态库的链接
把调要调用的函数或者过程直接链接到可执行文件(dll或exe)中,成为可执行文件的一部分。该文件中包含了运行所需的全部代码。

优点:
链接该静态库可执行文件(dll或exe等)的使用,无需再需要该静态库。
缺点:
a)当多个程序都要调用相同函数时,内存中就会存在这个函数的多个复制,存在资源浪费。
b)当静态库发生修改时,不仅该静态库要从新编译,引用该静态库的模块都需要从新编译。

2、动态库的链接
动态链接调用的函数代码并没有被复制到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库(dynamic link library,dll)之间建立链接关系。当要执行调用.dll文件中的函数时,根据链接产生的重定位信息,操作系统才转去执行.dll文件中相应的函数代码。
优点:
当修改动态库的代码,但重定位信息没有变化,引用该动态库的模块无需从新编译。当然,重定位信息发生改变,两者都需要从新编译。

3、动态库链接的方式
1)LoadLibrary(根据路径加载动态库)、GetProcAddress(根据函数名获取函数指针,可能为空,但只能在运行时发现)、FreeLibrary(卸载动态库)
2)具有导出项的(DLL)动态链接库可根据导出的lib和头文件隐式链接,在编译阶段就可检查头文件和lib是否配套。运行时再保证动态库和lib配套即可。

四、3种函数调用协议

__stdcall、__cdcel和__fastcall三者的区别https://www.cnblogs.com/yejianyong/p/7506465.html

五、问题(欢迎讨论)

1、extern、extern “C”、extern “C++”的不同
2、怎么导出导出重载函数?

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

静态链接库和动态链接库相关推荐

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

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

  2. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  3. Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

    from: Makefile常用万能模板(包括静态链接库.动态链接库.可执行文件) 本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接 ...

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

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

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

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

  6. c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)

    我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢? 其实,两个是完全不一样的东西.静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库.实际上静态库本身就包 ...

  7. cnsl是什么意思_VS2010下创建静态链接库和动态链接库

    VS2010下创建静态链接库和动态链接库 类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类 ...

  8. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  9. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  10. 生成静态链接库和动态链接库

    生成静态链接库和动态链接库 1.静态链接库 首先要生成.o文件 g++ -c test.cpp 然后就生成.a文件就行了 ar -r libtest.a test.o 如此一来我们就生成了静态链接库l ...

最新文章

  1. $‘\r‘: command not found解决方法
  2. OpenStack 部署运维实战
  3. hdu 1404/zoj 2725 Digital Deletions 博弈论
  4. spring boot的hello world小实验
  5. oracle重新编译package,如何有效的编译数据库中的失效对象(Package,trigger等)
  6. jrockit_JRockit – JRCMD有用的命令
  7. 如何快速在 Springboot 中集成拦截器? | 原力计划
  8. 什么是计算机游戏技术,dlss技术是什么意思有什么用?目前支持dlss的游戏有哪些?...
  9. dubbo的线程模型、派发策略、线程池策略
  10. 《python程序员面试宝典(陈屹)》chapter1 技术面试方法论
  11. cad转dwf简易教程
  12. 基于微信小程序驾校报名系统(微信小程序毕业设计)
  13. WSJ0数据集简单介绍
  14. 隐藏和isa :进化返祖以及白马非马(c++)
  15. 用uni.previewImage({}) 来直接做图片的预览和识别二维码
  16. LLC输出滤波电容选择
  17. 零代码爬虫工具----------后羿采集器
  18. 美剧《反恐24小时》
  19. jenkins 通过tag标签部署代码
  20. MATLAB2020a simulink 工具栏显示空白

热门文章

  1. 阿贝尔定理(幂级数收敛半径的)
  2. 消息系统——极光推送http://docs.jiguang.cn/
  3. java翻译smali_【翻译】apk反汇编之smali语法
  4. 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
  5. 连接型CRM与社交型CRM、传统漏斗型CRM有什么区别?
  6. 将Wi-Fi生成二维码
  7. 阿里云·天池大数据竞赛,快商通突破专业屏障,算法能力领跑全球
  8. 微信小程序蓝牙打印开发心得
  9. 小程序 图片显示模式详解
  10. ar ebs 销售订单关闭_雅视推AR眼镜虚拟试戴,眼镜行业科技转型强信号