目录
1、静态库和动态库有什么不同?
1.1、编译时的链接方式不同
2、如何制作库和如何调用库?以Window平台、C++语言、IDE VS2019为例
2.1、如何制作一个静态库?
2.2、如何调用静态库?
2.3、如何制作一个动态库?
2.4、如何调用动态库
2.4.1、隐式调用,也叫静态调用
2.4.2、显示调用 ,也叫动态调用
静态库采用静态链接,动态库采用动态链接。
使用静态库的时候,静态库和调用程序链接打包成了一个可执行文件。所以可执行文件比较大,想要升级静态库的话,就必须重新编译,全量升级。编译完成之后就不再需要静态库,也就是说运行时不需要静态库。
使用动态库的时候,动态库和调用程序不会链接打包在一起。所以可执行文件较小,想要升级动态库的话,只需要替换相应的动态库即可,不需要重新编译,不需要替换整个可执行文件,可实现增量升级。简单来说就是编译时不需要动态库,运行时需要动态库。
1、创建一个空项目
2、编写头文件和源文件
3、以静态库的方式生成
项目右键属性
静态库制作完成
很简单,只需要包含静态库的头文件和链接库路径
链接库的编译指令是:#pragma comment ( lib,"xxx.lib" )
也可以在项目->属性中设置静态库的路径
完成
和制作静态库不同的是
1、选择以动态库的方式生成
2、增加__declspec(dllexport),将动态库函数声明为导出函数
有两种调用动态库的方式:隐式调用和显示调用
2.4.1、隐式调用,也叫静态调用
调用的方式的静态库一样,只需要包含静态库的头文件和链接库路径
注意:动态库的.lib文件和静态库的.lib 文件完全不是一回事,动态库.lib文件主要是帮助调用程序找到动态库的函数地址,而函数实现都在.dll文件里,静态库的函数实现在.lib文件里。
2.4.2、显示调用 ,也叫动态调用
这里需要用到加载、获取动态库函数地址、卸载的函数,包含在Windows.h里
一运行我们发现,获取动态库函数地址失败
原因是函数的名字在动态库里面并不叫"Add",我们用depends工具看一下
函数的名字叫:?Add@@YAHHH@Z,这是因为C++语言函数可以发生重载的缘故,编译器编译的时候在函数名前面和后面增加了一些信息来区别重载。
解决方法有两个。1、动态库使用C语言的编译器 。2、在动态库函数声明前面加一个 extern "C",指示编译器以C语言的方式导出。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/75670.html