一,动态链接库的基本概念

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++中的动态链接库的更多相关文章

  1. [原创]VS2010中创建动态链接库及其调用

    [原创]VS2010中创建动态链接库及其调用 一.创建动态链接库 在VS2010中创建动态链接库的步骤如下: 1)生成->编译->生成MyDll 二.调用 当调用DLL中的方法,程序编译产 ...

  2. 通过ffi在node.js中调用动态链接库[转]

    http://blog.csdn.net/zhulin2609/article/details/51474676

  3. pycharm中import动态链接库pyd有错误

    有红色波浪线提示unsolved reference云云 去setting里面设置interpreters,  在path里面添加对应的路径, 是包含对应头文件的路径, 不要忘记右边的小按钮去Relo ...

  4. LINUX系统中动态链接库的创建与使用

    大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...

  5. LINUX系统中动态链接库的创建与使用{补充}

    大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...

  6. linux中动态链接库的创建与使用

    LINUX系统中动态链接库的创建与使用 http://www.cnblogs.com/ardar/articles/357321.html 正常C源文件编写,编译时-shared即可得到SO, gcc ...

  7. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  8. C#将dll打包到程序中

    最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...

  9. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

随机推荐

  1. es6笔记7^_^class

    ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. 部分来自JavaScript ES6 class指南.mozilla https: ...

  2. C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)

    前言:大过年的,写篇文章不容易,还是给自己点个赞~~年前找了下.net安装包的制作方法,发现Visual Studio自带的制作工具使用起来非常麻烦,需要单独下载安装包,并且什么激活认证等等屁事相当麻 ...

  3. C# 结构体 枚举类型

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

  4. Express之get,pos请求参数的获取

    Express的版本4.X Get query参数的获取 url假设:http://localhost:3000/users/zqzjs?name=zhaoqize&word=cool& ...

  5. PHP文本处理之中文汉字字符串转换为数组

    在PHP中我们可以通过str_split 将字符串转换为数组,但是却对中文无效,下面记录一下个人将中文字符串转换为数组的方法. 用到的PHP函数 mb_strlen - 获取字符串的长度 mb_sub ...

  6. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  7. shell-早间学习,每日一点

    1.定位行: sed -n '12,~3p' pass #从第12行开始,直到下一个3的倍数行(12-15行) sed -n '12,+4p' pass #从第12行开始,连续4行(12-16行) s ...

  8. 【CNMP系列】CentOS7.0下安装PHP5.6.30服务

    上一节我们讲过了如何在CentOS7.0下安装MySql服务,如果没有看到欢迎页面的朋友,可以加我的个人微信详聊:litao514148204 附上一节地址:http://www.cnblogs.co ...

  9. dedecms织梦自定义表单提交之后如何发送到邮箱!

    但是往往一些客户需要做一些提交信息到后台并发送到指定的邮箱. 一.直接打开plus下面的diy.php文件:  85行:$query = "INSERT INTO `{$diy->ta ...

  10. 每天一个Linux命令(23)--linux 目录结构(二)

    二./usr 的意义与内容 依据FHS的基本定义, /usr 里面放置的数据属于可分享的与不可变动的(shareable,static), 如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的 ...