本文转载自https://blog.csdn.net/sj2050/article/details/81700183 测试环境为win10+vs2015+C++


目录

静态库

什么是静态库?

怎么创建

如何使用

静态库的第一种使用方法

静态库的第二种使用方法

动态链接库

动态库是什么?

怎么创建

如何使用

隐式调用

显式调用


静态库

什么是静态库?

我们先来说一下什么是静态库,维基百科对其的解释是这样的:

在计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。以过去的观点来说,库只能算是静态(static)类型。

————维基百科

对于官方的解释总是令人头大,我们可以简单地认为静态库就是一组二进制代码(.obj)的集合,然后嵌入到我们的程序经过汇编形成的二进制文件中,最终形成可执行文件。

怎么创建

1、我们先新建一个项目,选择win32项目

2、在接下来的应用程序向导中选择静态库并去掉预编译头的勾。

3、创建头文件(.h)以及源文件(.cpp),它们的格式如下:

  1. //MyLib.h
  2. #pragma once
  3. #ifndef _STATIC_LIB_H_
  4. #define _STATIC_LIB_H_
  5. #include <iostream>
  6. namespace STATIC_LIB
  7. {
  8. void PrintHello(); //测试函数
  9. }
  10. #endif
  1. //MyLib.cpp
  2. #include "MyLib.h"
  3. void STATIC_LIB::PrintHello()
  4. {
  5. std::cout << "Hello world!" << std::endl;
  6. }

4、然后,我们选择release,生成解决方案(这么简单的函数应该不用调试了吧)

5、随后,我们可以在自定的项目路径下的release文件夹下看到生成的lib文件。

如何使用

关于静态库我们有两种使用方法,我们分别来介绍一下:

静态库的第一种使用方法

1、我们先创建个普通的win32控制台程序,选择空项目即可。

2、然后我们把上面创建lib时的头文件包含到新创建的控制台程序中:

3、然后在源程序中写如下格式的代码调用即可:

  1. #include <iostream>
  2. #include "MyLib.h"
  3. #pragma comment(lib,"MyLib.lib")
  4. int main()
  5. {
  6. STATIC_LIB::PrintHello();
  7. system("pause");
  8. return 0;
  9. }

我们对#pragma comment中的内容做些说明,它搜索的路径就是在与项目文件名同名的文件夹下,所以我们可以直接将lib文件复制到该文件夹中,当然我们也可以使用绝对路径:

还需注意的是,刚才我们创建的lib是在release环境下创建出来的,此时调用也应在release环境下,不要出现鸡同鸭讲的情况,当然,你也可以都是在debug环境下环境下创建的。

静态库的第二种使用方法

1、我们创建一个include文件夹和lib文件夹用来存放头文件和lib文件:

2、项目名那右击,选择属性,在弹出的属性页窗口中选择VC++目录,然后添加进这两个文件夹

3、将先前创建lib时的头文件和lib文件分别复制到这两个文件夹中:

4、接着,再在属性页面中选择链接器--输入--附加依赖项中添加我们的lib

5、准备工作完成,在我们调用的程序中使用如下格式的代码即可调用:

  1. #include <iostream>
  2. #include "MyLib.h"
  3. int main()
  4. {
  5. STATIC_LIB::PrintHello();
  6. system("pause");
  7. return 0;
  8. }

成功运行的截图:

静态库的优点很明显,想想平时使用的标准库的优点就行了,但缺点当然也很明显,静态库是直接嵌入到可执行程序中的,会导致生成的可执行文件体积较大。当初正是为了避免此问题,才开发了动态库技术。

动态链接库

动态库是什么?

以下是维基百科的解释:

动态链接库(英语:Dynamic-link library,缩写为DLL)是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是.DLL.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。DLL的文件格式与视窗EXE文件一样——也就是说,等同于32位视窗的可移植执行文件(PE)和16位视窗的New Executable(NE)。作为EXE格式,DLL可以包括源代码、数据和资源的多种组合。

————维基百科

官方的解释就是这么高大上,粗人的理解就是相对于上面静态库,静态库是直接把代码嵌进去,而动态库则是类似独立的程序。打个比方的话就是静态库就是你留在这别走了,而动态库就是你要帮忙时叫我一下,我再来。

怎么创建

动态库的创建和静态库类似

1、在win32向导中选择dll,并选择空项目创建。

2、建立如图几个文件

3、各个文件中的内容如下:

  1. //MyDll.h
  2. #pragma once
  3. #ifndef _DLL_TEST_H_
  4. #define _DLL_TEST_H_
  5. #include <iostream>
  6. namespace DLL_TEST
  7. {
  8. void PrintHello();
  9. }
  10. #endif // !_DLL_TEST_H_
  1. //MyDll.cpp
  2. #include "MyDll.h"
  3. void DLL_TEST::PrintHello()
  4. {
  5. std::cout << "Hello world!" << std::endl;
  6. }
  1. //MyDll.def
  2. LIBRARY MyDll
  3. EXPORTS
  4. PrintHello

这里对模块定义做一些说明(最后一个文件),LIBRARY后跟的是项目名,EXPORTS后是这个dll中需要导出的函数名。

如何使用

动态链接库的使用方法也有两种

隐式调用

隐式调用就是把dll在程序运行前都先载入到内存中,然后程序运行后直接调用即可,实现方法如下:

1、创建win32控制台空项目

2、将上面创建Dll过程中的头文件(.h),lib文件以及dll文件复制到与项目同名的文件夹下:

3、然后写如下格式的代码即可调用

  1. #include <iostream>
  2. #include "MyDll.h"
  3. #pragma comment(lib,"MyDll.lib")
  4. int main()
  5. {
  6. DLL_TEST::PrintHello();
  7. system("pause");
  8. return 0;
  9. }

我们说明一下,这里的lib文件是用来告诉程序dll中有哪些信息而已。

显式调用

显示调用借助了windows库

直接在调用程序中写如下代码即可调用:

  1. #include <iostream>
  2. #include <windows.h>
  3. int main()
  4. {
  5. // TODO: Add your control notification handler code here
  6. HINSTANCE hInst;
  7. hInst = LoadLibrary(L"MyDll.dll");
  8. typedef void(*Sub)();//函数指针
  9. Sub PrintHello = (Sub)GetProcAddress(hInst, "PrintHello");//从dll中加载函数出来
  10. PrintHello();//运行函数
  11. FreeLibrary(hInst); //LoadLibrary后要记得FreeLibrary
  12. system("pause");
  13. return 0;
  14. }

成功运行截图:

与隐形调用一股脑子地把所有dll加载到内存中不同,显式调用则是你要用到哪个dll就加载进来,不用了销毁了,极大地省下了空间,所以笔者推荐用第二种方法。

至此,静态库和动态库的创建和使用都介绍完毕了,也感谢各位看到此的读者,希望我的努力能让你进步一点点,这就够了!

参考资料:

  • 浅谈Windows平台下C++调用静态链接库的方式
  • C++编程笔记:dll的生成与使用


http://www.taodudu.cc/news/show-3144894.html

相关文章:

  • 手把手教你如何制作和使用lib和dll
  • HRBU 2021年暑期训练阶段三Day1
  • 运维利器之mysql进行表的分区
  • 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
  • Java之List系列--去重的方法
  • A Novel Lip Descriptor for Audio-Visual Keyword Spotting Based on Adaptive Decision Fusion(2016)
  • 二叉树的遍历及解题思路
  • 【深度学习】万字解读首篇「人脸复原」综述!南大、中山、澳国立、帝国理工等联合发布...
  • java:均值哈希实现图像内容相似度比较
  • 很不懂 对网络上面的话很不懂
  • STL-老子的全排列呢
  • [转]我是一个粗人
  • 粗人只怪自己是个粗人
  • 1030 Travel Plan (30分)(俺是个粗人)
  • 粗人之玩转Buffer
  • 粗人之玩转Channel
  • 我是个粗人
  • 无线路由器服务器密码忘记了怎么办,忘了路由器密码怎么进行ip设置
  • linux 开机连接wifi密码忘了怎么办,WIFI密码忘了怎么办 两种方法轻松找回密码
  • 计算机上在网络密码,电脑上怎么使用无线网络密码
  • linux 开机连接wifi密码忘了怎么办,自己设置的wifi密码忘了怎么办?
  • linux连接wifi账户密码忘了怎么办,wifi登录密码忘记了怎么办?
  • 计算机管理员没设密码忘了怎么办,没有电脑路由器密码忘记了怎么办?
  • 无线密码忘记了,怎么找回?
  • 联想计算机如何设置用户名和密码忘了,联想(Lenovo)路由器无线wifi密码忘记了怎么办啊?...
  • linux 无线 密码忘记了怎么办,linux忘记了密码怎么办
  • 无线网密码怎么改服务器停用,手机怎么修改无线网密码?
  • linux没有无线wifi密码忘记,无线wifi密码忘记了怎么办_忘记无线网密码怎么办?-192路由网...
  • linux 开机连接wifi密码忘了怎么办,无线密码忘了怎么办?
  • 达人评测 iPad mini6怎么样 mini6参数配置

如何制作使用lib和dll相关推荐

  1. 简单的制作一个动态链接库(DLL)

    什么是静态链接库,动态链接库? 静态链接库是一个lib文件,动态链接库是一个dll文件.他们都是把一个或多个函数,代码封装起来,所形成的一个文件. 为什么需要用链接库呢? 因为有的时候,像是一个大的项 ...

  2. Dev C++开发lib和dll

    下面通过例子简单介绍dev c++ 是如何开发lib和dll并使用的.关于dev c++ 我使用的版本是5.11,单击下载: 一.创建项目结构(文件夹) 为了使整个项目例子看起来比较易于管理,下面我们 ...

  3. CorelDRAWX4的VBA插件开发(三十一)使用C++制作动态连接库DLL辅助VBA构键强大功能-(5)在VBA中动态调用DLL文件

    我们先来看一下动态调用的截图 先上代码 '静态调用 Public Declare Function wodedll Lib "E:\VS-DLL\conglingkaishi\Debug\C ...

  4. ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义

    FROM: http://blog.csdn.net/sptoor/article/details/6203376 很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) ...

  5. lib和dll文件的区别和联系

    什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)      (1)lib是编译时需要的,dll是运行时需要的.  如果要完成源代码的编译,有lib就够了.  如果 ...

  6. lib和dll文件的区别和联系(集合了几个博客的内容)

    lib和dll lib和dll文件的区别和联系 .dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行. ...

  7. C/C++ 知识点---LIB和DLL的区别与使用(网摘)

    LIB和DLL的区别与使用 原文出处:[远风工作室] 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dyn ...

  8. LIB和DLL的区别与使用,非常详细

    2019独角兽企业重金招聘Python工程师标准>>> 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供, ...

  9. msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义

    转载 很需要补充的知识. 可惜网络阅读一直不是强项. 目前实在有点看不进去. 先保存下来吧... 牛到连评论都是贼深奥滴! 很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Libra ...

最新文章

  1. 架构师之路 — 业务架构 — Overview
  2. 使用Pytorch从零搭建高精准度实时目标检测框架
  3. element 增加自由验证
  4. fastjson android 版本,fastjson 1.1.58.android 发布,Bug 修复版本
  5. 一个声称南方985普通学生,前端学习10个月,秋招斩获字节跳动offer的分享!
  6. 在计算机系统中使用加载器,在个人计算机系统中从软盘加载基本输入/输出系统的设备和方法...
  7. po3580SuperMemo(splay)
  8. PostgreSQL条件语句
  9. ias日志察看器(.net)
  10. Atitiit java通过Exchange协议同步note 记事本 目录 1.1.1. 使用EWS(Exchange Web Service)协议读取邮件、发送邮件 1 最新问题 1 热门问题 1
  11. 迅雷下载百度网盘的资源
  12. 全国计算机类大学排名二本,二本计算机大学排名,二本计算机大学排名
  13. 银河麒麟高级服务器操作系统 V10 版本安装教程
  14. 解决log4j2子线程无法获取到traceId问题
  15. 基于智能手机的报纸阅读器-论文
  16. Vertica—操作汇总
  17. VS2017如何设置C++11?
  18. STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)
  19. 店铺宝贝标题该怎么优化
  20. Carbon Streaming提供股票和权证合并的最新信息,以寻求潜在的美国上市

热门文章

  1. 2009年9月刊《程序员》算法题之我见——思索之一
  2. SQL语句:rtrim及ltrim 函数
  3. Deep Learning for Generic Object Detection: A Survey -- 目标检测综述总结
  4. JavaWeb实战项目之乐购商城V1.0(一)-------环境搭建
  5. 11月需要重点关注的SCISSCIEI合集(超级全)
  6. 【Unity入门】10.物体的运动
  7. Web3.0 兴起,元宇宙或接管互联网?
  8. 使用JDK自带工具keytool生成ssl证书
  9. PART 4 描述性统计分析
  10. python程序员职业规划书_读书笔记之《程序员必读的职业规划书》