本文的内容经过本人亲自调试,确保可用,实用,测试环境为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就加载进来,不用了销毁了,极大地省下了空间,所以笔者推荐用第二种方法。

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

参考资料:

手把手教你如何制作和使用lib和dll的更多相关文章

  1. 手把手教你如何制作和使用lib和dll_转载

    目录 静态库 什么是静态库? 怎么创建 如何使用 静态库的第一种使用方法 静态库的第二种使用方法 动态链接库 动态库是什么? 怎么创建 如何使用 隐式调用 显式调用 静态库什么是静态库?我们先来说一下 ...

  2. 手把手教你制作AppPreview视频并上传到appStore进行审核

    手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...

  3. PWA入门:手把手教你制作一个PWA应用

    摘要: PWA图文教程 原文:PWA入门:手把手教你制作一个PWA应用 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 简介 Web前端的同学是否想过学习app开发,以弥补自 ...

  4. 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)

    1.简介 在实际测试中,我们不仅需要读取Excle,而且有时候还需要读取CSV类的文件.如何去读取CSV的文件,宏哥今天就讲解和分享一下,希望对你能够有所帮助.前面介绍了如何读取excel文件,本篇介 ...

  5. 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)

    手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...

  6. 手把手教你接口自动化测试 – SoapUI & Groovy

    手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...

  7. 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)

    转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...

  8. 手把手教你用动软.NET代码生成器实例教程

    动软实战攻略 手把手教你用动软 文档编号:20110421 版权所有 © 2004-2011 动软 在线帮助:http://help.maticsoft.com 目录   一.        产品介绍 ...

  9. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

随机推荐

  1. 跟我一起学.NetCore之静态文件处理的那些事

    前言 如今前后端分离开发模式如火如荼,开发职责更加分明(当然前后端一起搞的模式也没有完全褪去):而对于每个公司产品实施来说,部署模式会稍有差别,有的会单独将前端文件部署为一个站点,有的会将前端文件和后 ...

  2. PooledByteBuf内存池-------这个我现在不太懂

    转载自:http://blog.csdn.net/youaremoon/article/details/47910971              http://blog.csdn.net/youar ...

  3. 从基础到实践,一文带你看懂HashMap

    摘要:HashMap是一个用于存储Key-Value键值对的集合,它是面试中经常问到的一个知识点. HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一,因为通过Has ...

  4. Java多线程--CAS

    在Java多线程并发的情况下同时对一个变量进行操作会出现线程安全的问题,假如我们现在使用20个线程对一个变量不停累加1,代码如下: 1 public class ThreadDemo implemen ...

  5. Python爬取股票信息,并实现可视化数据

    前言 截止2019年年底我国股票投资者数量为15975.24万户, 如此多的股民热衷于炒股,首先抛开炒股技术不说, 那么多股票数据是不是非常难找, 找到之后是不是看着密密麻麻的数据是不是头都大了? 今 ...

  6. TabLayout+ViewPager制作简单导航栏

    先看样例,有图有真相 绑定viewpager 此处主要说明tablayout的使用方法,viewpager绑定fragment的介绍在其他文章说明 mBinding.tabsLayout.setupW ...

  7. postgreSQL与Kingbase 字符串裁剪区别

    --postgreSQL postgres=# select substring('abcdefg',0,4); substring abc (1 行记录) postgres=# select sub ...

  8. 记录一次源码扩展案列——FastJson自定义反序列化ValueMutator

    背景:曾经遇到一个很麻烦的事情,就是一个json串中有很多占位符,需要替换成特定文案.如果将json转换成对象后,在一个一个属性去转换的话就出出现很多冗余代码,不美观也不是很实用. 而且也不能提前在j ...

  9. 晋城6397.7539(薇)xiaojie:晋城哪里有xiaomei

    晋城哪里有小姐服务大保健[微信:6397.7539倩儿小妹[晋城叫小姐服务√o服务微信:6397.7539倩儿小妹[晋城叫小姐服务][十微信:6397.7539倩儿小妹][晋城叫小姐包夜服务][十微信 ...

  10. ERP订单管理的操作与设计--开源软件诞生19

    赤龙ERP订单模块讲解--第19篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...