C++中的动态链接库
一,动态链接库的基本概念
1.DLL(Dynamic Linker Library)的概念
- 可以把DLL看做是一个仓库,它提供了一些可以直接拿来用的变量,函数或者类(但是不建议从DLL中获取变量),在历史的发展中,仓库经历了从“无库 - 静态链接库 - 动态链接库”的时代。
- 静态链接库(.lib)和动态链接库(.dll)都是共享代码的方式。如果采用了静态链接库,则无论你愿不愿意lib中的代码指令都被直接包含进了最终生成的.exe程序中。但若是使用了动态链接库,该DLL则不会被包含进.exe程序中,当.exe程序执行的时候,再“动态”的来引用或者卸载DLL。
2.动态链接库的特点
- DLL文件可以被其他的语言所调用,例如C#或者Java等。
- 譬如Window下的存在大量的DLL文件,当我们用Java编写Swing界面或者其他语言如C#等都是可以进行调用的。
3.常见的动态链接库
- 我们在Window系统下面的system32文件夹中会看到kernel.dll、user32.dll和gdi32.dll。Window系统下的大多数API都是包含在这些DLL中。
- kernel.dll中的函数主要处理内存管理和进程的调度。
- user32.dll中的函数主要控制用户界面。
- gdi32.dll中的函数主要负责图形方面的操作。
4.静态链接库和动态链接库的调用说明

- 从上图中可以看出,静态链接库和动态链接库都是在程序的“链接”阶段进行调用的,但是静态库和动态库的链接方式是不一样的。
- 静态库的链接是把.lib的代码指令全部链接到最终生成的EXE程序中。
- 动态链接库的链接是只链接.dll文件的地址引用,因此生成的EXE程序中不包含.dll的代码指令,所以.dll生成的可执行程序要比.lib生成的小很多,根据实验,一个仅包含printf的函数的生成程序,在静态链接库中需要800k,而动态链接库只需要8k左右,可以见其差100倍。
二,静态库的创建和调用
1.静态链接库的创建
①创建一个Win32控制台应用程序

②点击下一步

③选择静态库应用程序类型,去掉预编译和安全检查后,点完成。

④项目创建完成后,添加MathUtils类

⑤编写MathUtils类的.h和.cpp文件,为打包成静态库做准备

⑥编写完成后,点击生成程序即可,然后在Debug目录下就会出现.lib程序

2.静态链接库的调用
①按照上面的方式再创建一个项目,这里起名为TestLibDemo,注意这里的程序类型是控制台应用程序。然后编写main.cpp文件。

②静态连接库的调用需要引入.h文件和.lib文件,因此我们把上面创建的MathUtils项目里的MathUtils.h和MathUtils.lib文件复制到TestLibDemo项目的文件夹下面,lib文件放在lib文件夹下

③在main.cpp中引入MathUtils.h头文件,并编写测试用例

④我们发现我们可以调用这些方法,但是却无法创建,这是因为我们只引入了头文件,并没有指定lib文件的位置和要链接的lib文件,所以需要我们在程序“链接”过程中将.lib文件包含到程序中。首先选中项目后右击项目点击“属性”,在“链接器 - 常规 - 附加库目录”这个选项里,将我们放置lib文件的目录指定出来。然后点击“输入 - 附加依赖项”将MathUtils.lib添加进入就可以了。


⑤然后再重新运行测试程序就可以执行了

⑥还有一种非配置项目的方式链接lib文件,我们在配置好lib文件所在的目录后,可以在代码中指定要引入的静态库文件,但是要先把上面的附加依赖项里已经引入的lib文件去掉。

3.静态链接库的总结
- 在创建静态连接库的时候,需要注意要创建的是静态库程序,而非其他应用程序。
- 在调用静态链接库的时候,需要准备的是头文件(.h)和静态库文件(.lib),缺一不可。然后把头文件和静态库文件放到项目的目录下,在编辑器中,在测试项目的链接器的输入栏中,指定要加载lib文件的目录。在引用lib的时候有两种,一种是编辑器方式设置,另一种是在代码中设置。
三,动态链接库的创建和调用
1.动态链接库的创建
①新建项目,这里的应用程序类型选择dll程序,选择导出符号,这样会默认为我们创建模板。

②创建完成后的项目给我们包含了示例代码,包含了导出变量,导出函数,导出类。

③我们生成项目,就可以在项目下找到MyDLL.dll这个动态链接库文件。
2.动态库的调用
①我们新创建一个项目,名称为TestDLL,因为.dll是在运行时动态加载,所以需要把上一步产生的.dll文件拷贝到该运行程序的目录下。
②加载动态库,并获取动态库的函数的地址,并调用。

3.动态库的创建和调用总结
- 动态库的创建就是使用__declspce(dllexport)指令来进行导出,然后将该定义好的宏放到函数,变量或者类的前面,在预编译阶段,将宏进行替换。注意一点的是,我们在调用动态库的函数时候,通常会加上extern "C"这个指令,因为c++代码的函数有重载,会把函数的名称进行重新的替换,我们在加载动态库的时候倘若有重载就会找不到该函数,所以我们希望c++的函数以c的风格进行生成,就不会产生该问题。dllmain.cpp是dll文件的入口程序,主要处理多个.dll文件的时候用到,这里一般用不到。
- 动态库的调用我们采用的灵活的方式进行动态的“加载”和“卸载”,需要先引用window的API,不要忘记释放动态库。(动态的载入变量和类还不会...).
C++中的动态链接库的更多相关文章
- [原创]VS2010中创建动态链接库及其调用
[原创]VS2010中创建动态链接库及其调用 一.创建动态链接库 在VS2010中创建动态链接库的步骤如下: 1)生成->编译->生成MyDll 二.调用 当调用DLL中的方法,程序编译产 ...
- 通过ffi在node.js中调用动态链接库[转]
http://blog.csdn.net/zhulin2609/article/details/51474676
- pycharm中import动态链接库pyd有错误
有红色波浪线提示unsolved reference云云 去setting里面设置interpreters, 在path里面添加对应的路径, 是包含对应头文件的路径, 不要忘记右边的小按钮去Relo ...
- LINUX系统中动态链接库的创建与使用
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...
- LINUX系统中动态链接库的创建与使用{补充}
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...
- linux中动态链接库的创建与使用
LINUX系统中动态链接库的创建与使用 http://www.cnblogs.com/ardar/articles/357321.html 正常C源文件编写,编译时-shared即可得到SO, gcc ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- C#将dll打包到程序中
最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
随机推荐
- 自动化测试框架中关于selenium api的二次封装
不多说,直接看代码如下: #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.action_chai ...
- 我为什么不看好微信小程序
我自认为对新技术还是比较有热情的,可对于小程序这个“新技术”,我却完全是被动的.去年9月份的时候,微信小程序开始内测,瞬间引爆朋友圈.知乎等一众分享平台.当时我大概了解了一下,觉得从技术角度上来说没啥 ...
- JS高级程序设计--笔记
1.JS分三个部分:ECMAScript.DOM.BOM 1)ECMAScript:提供核心语言功能 2)DOM:提供访问和操作网页内容的方法和接口 3)BOM:提 ...
- Python抓取百度百科数据
前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...
- ZLG_GUI和3D显示的移植
最近学习NRF51822,想在OLED上移植个强大的GUI ,本来想学习emWIN的,甚至想直接学习自带GUI的嵌入式操作系统RTThread,但是......哎,太懒了.....现在觉得ZLG_GU ...
- GitLab Wiki 内容恢复版本管理
原来一直在网站上写Wiki文档, 最近手欠误删一篇文档, 想要恢复文档时才发现原来gitlab的Wiki是用git管理的从此再也不用为误删担心了 实现步骤: mac系统安装gollow brew in ...
- 判断数据是否服从某一分布(二)——简单易用fitdistrplus包
一.对数据的分布进行初步判断 1.1 原理 对于不同的分布,有特定的偏度(skewness)和峰度(kurtosis),正态分布.均匀分布.逻辑斯谛分布.指数分布的偏度和峰度都是特定的值,在偏 ...
- JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌
服务器的JAVA进程使用的内存是否正常 服务器中,JAVA进程的内存占用= JVM内存+ JAVA堆最大内存大小(Xmx)+JAVA堆外内存大小+栈区( 线程数* Xss) 最需要关注: 1., 服务 ...
- 第一章 Java语言概述
1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...
- winsshfs的快速入手
之前在公司使用mac ,并且通过mac下的osfuse和sshfs连接,直接将虚拟机的文件目录同步到了本地,并且可以进行实时操作修改,对于写项目,确实是省了很大一部分上传的精力. 于是在自己的win下 ...