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

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. 从[NOI2008志愿者招募]浅谈线性规划在网络流构图上的巧用

    首先来看一下题..http://www.lydsy.com/JudgeOnline/problem.php?id=1061 1061: [Noi2008]志愿者招募 Description 申奥成功后 ...

  2. 详解googe Chrome浏览器(理论篇)

    开篇概述 1详解google Chrome浏览器,这个标题似乎抽象了一些,我想应该把它拆分成如下几个问题,也许会更加理解一些. 问题1:目前开发中,主选浏览器有Google Chrome,IE,Fir ...

  3. 通过spring实现javamail发送邮件功能

    以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念 首先 ...

  4. experss框架—基础认识

    express简介: Express是一个简洁.灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析.静态文件服务.中间件.路由控制等等,并且还可以使用插件或整合其他模块 ...

  5. 数据结构(Java描述)之二叉树

    基础概念 二叉树(binary tree)是一棵树,其中每个结点都不能有多于两个儿子. 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它 ...

  6. Cookie与Passport安全

    对于web系统而言,由于HTTP协议无状态的特性,用户登录时需要服务端生成通行证返回给浏览器.浏览器保存该通行证并在接下来的请求中携带该通行证.通常来讲,web系统使用http cookie来保存和传 ...

  7. Ubuntu纯字符界面的一些设置

    由于Ubuntu的纯字符界面不支持中文显示,所以进行了一些配置,为了更好的显示 1. 把环境语言配置为英文 在用户目录下的".bashrc"文件的结尾处添加以下内容,然后重新登录 ...

  8. 5天2亿活跃用户,QQ“LBS+AR”天降红包活动后台揭密

    作者:Dovejbwang,腾讯后台开发工程师,参与“LBS+AR”天降红包项目,其所在“2016春节红包联合项目团队”获得2016公司级业务突破奖. 商业转载请联系腾讯WeTest获得授权,非商业转 ...

  9. vc中Error spawning cl.exe错误的解决方法.

    可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过.很多人的 选择是重装, ...

  10. JavaScript 基本类型值-Undefined、Null、Boolean

    ▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...