一、VS2013动态库文件的创建

1、新建项目,win32,win32项目,输入项目名称,例如MakeDll。

2、”确定“——”下一步“,选择”DLL“选项,再点”完成“:

3、菜单栏选择”项目“——>”添加新项“,来创建头文件MakeDll.h。

MakeDll.h中输入以下例子代码:

 1 #ifdef DLL_API//如果已经定义就什么都不做
 2     //nothing to do
 3 #else //否则定义DLL_API
 4     #define DLL_API __declspec(dllexport)    //_declspec(dllexport):导出标志
 5 #endif
 6 #include <iostream>
 7 using namespace std;
 8 DLL_API int add(int a, int b);//导出单独的函数
 9 class DLL_API Point    //导出类,其自身所有函数都将被导出,可单独对某些类函数导出
10 {
11 private:
12     float x, y;
13 public:
14     Point();
15     void SetPoint(float a, float b);
16     void DisPlay();
17 };

4、创建cpp文件:MakeDll.cpp。

MakeDll.cpp中输入以下例子代码:

 1 #include "MakeDll.h"
 2
 3 int add(int a, int b)
 4 {
 5     return a + b;
 6 }
 7
 8 Point::Point()
 9 {
10     x = 0.0f;
11     y = 0.0f;
12 }
13
14 void Point::SetPoint(float a, float b)
15 {
16     x = a;
17     y = b;
18 }
19 void Point::DisPlay()
20 {
21     cout << "x=" << x << endl;
22     cout << "y=" << y << endl;
23 }

5、菜单栏选择”生成——>生成解决方案“。

此时在MakeDll项目所在目录下的Debug目录下的文件有MakeDll.dllMakeDll.lib了。生成动态链接库文件OK。

二、使用刚才创建的动态库

1、新建项目——win32控制台应用程序,命名为UseDll,并创建一个lib文件,将MakeDll.lib引导库放进去,

并将MakeDll.dll放进debug下,编译器会自动搜素到这个文件,当然可以放在系统目录下。

2、告诉编译器头文件MakeDll.h的位置(见包含目录)、引导库位置(见库目录)及其名字(见附加依赖项)。注意,以下是添加后的显示结果。

                         图.包含目录的设置

                        图.库目录的设置

                        图.附加依赖项的设置

3、最后,动态库的测试程序如下,测试程序需要引用头文件:

 1 #include <iostream>
 2 #include "MakeDll.h"
 3 using namespace std;
 4
 5 int main()
 6 {
 7     int a = 10;
 8     int b = 2;
 9     int c = add(a, b);
10     cout << c << endl;
11     Point p1, p2;
12     p2.SetPoint(5.6f, 7.8f);
13     p1.DisPlay();
14     p2.DisPlay();
15     getchar();
16     return 0;
17 }

运行结果:

至此测试成功!

三、h头文件 .lib库文件 .dll动态链接库文件关系

.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的

附加依赖项添加的是.lib而不是.dll,若生成了DLL,则肯定也生成了LIB文件。

.h .lib .dll三者的关系

H文件的作用:声明函数接口

DLL文件作用:函数可执行代码

LIB文件作用:当我们在自己的程序中引用了一个H文件里的函数,链接器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用了。它告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项.LIB文件,它起到桥梁的作用。

如果是生成静态库文件,则没有DLL,只有lib,这时函数可执行代码部分也在lib文件中

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

静态编译的lib文件的好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

在动态库的情况下,有两个文件,而一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误

在VC中加载LIB文件的几种方法

  ①LIB文件直接加入到工程文件列表中 

    在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。

  ②设置工程的 Project Settings来加载DLL的LIB文件 

    之前的步骤提到过,这里不再提。

  ③通过程序代码的方式 

    加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。

  当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。

四、动态链接库的优点

因为动态链接库是将功能封装在一起的模块,因此,与将代码直接写入调用模块中相比,它不仅可以提高程序的复用,减少代码开发工作量,同时使得功能更新更方便。除了这些模块化带来的优点外,动态链接库的工作方式也决定了它先天具有比静态链接更多的优点,如下所述。

1、节约内存和减少交换:当应用程序使用动态链接时,多个进程可以同步使用一个DLL共享内存中DLL的单个副本。相比之下,当应用程序使用静态链接库时,Windows必须为每个应用程序装载一个库代码的副本到内存中。

2、节约磁盘空间:当应用程序使用动态链接时,多个应用程序可以共享磁盘上单个DLL副本。相比之下,当应用程序使用静态链接库时,每个应用程序要将库代码作为独立的副本链接到可执行镜像中。

3、当DLL中的函数修改时,只要函数参数、调用规定和返回值没有改变,使用DLL的应用程序不需要重新编译或链接。而静态链接的函数改变时,需要应用程序重新链接。

4、支持多语言编程:只要应用程序遵循相同的调用规范,则使用不同编程语言编写的程序可以调用相同的DLL函数。程序和DLL函数必须兼容:函数定义的参数入栈顺序,函数或应用程序谁来负责清理堆栈,参数是否传入寄存器中等方面必须兼容。

5、轻松的创建中间版本:通过将资源放入DLL中,使得创建应用程序的中间版本非常简单。如可以将应用程序的每个语言版本的字符串放到单独的一个资源DLL中,并为不同的语言版本装载合适的资源DLL就可以了。

虽然使用DLL有诸多的优点,但是也需要格外注意使用DLL的缺点。即调用DLL的应用程序不是独立的,程序的运行依赖于所使用的DLL是否存在。

转自http://blog.csdn.net/ebowtang/article/details/38499927

转载于:https://www.cnblogs.com/codingmengmeng/p/6287425.html

【转】VS2013动态库文件的创建及其使用详解相关推荐

  1. VS2013动态库文件的创建及其使用详解

    一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2."确定"--"下一步",选择"DL ...

  2. 【转】matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件

    转自:matlab与C/C++混合编程--在Windows/Linux上调用Matlab编译的动态库文件_sinat_18131557的博客-CSDN博客 date version comments ...

  3. CMake教程(二)- 添加静态库文件和动态库文件

    CMake教程(二)- 添加静态库文件和动态库文件 什么是库文件 静态链接库 动态链接库 静态库和动态库的区别 如何在CMake中添加库文件 CMake 中 target_link_libraries ...

  4. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  5. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )

    文章目录 一.使用 IDA 打开 arm 动态库文件 二.切换 IDA 中汇编代码显示样式 一.使用 IDA 打开 arm 动态库文件 分析 Android SDK 中的 arm 架构的动态库 , 动 ...

  6. 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 )

    文章目录 一.使用 IDA 打开动态库文件 二.IDA 中查找指定的方法 一.使用 IDA 打开动态库文件 分析 Android SDK 中的 x86 架构的动态库 , 动态库位置 : D:\001_ ...

  7. matlab将脚本导出动态库文件.dll,并被python调用

    文章目录: 一.matlab将脚本生成动态库.dll文件 1.1 编写简单的脚本函数 1.2 生成dll文件 二.python调用.dll 所使用的的环境如下: 系统:windows10 matlab ...

  8. *nix下部署第三方动态库文件

    最近写的一些程序经常需要放到不同的机器上执行,就做了一些工作,减少配置环境的时间,尽量做到从代码库里check out代码到本地就可以直接执行(或者make一次之后执行).或者说,花了一点时间把程序做 ...

  9. Java使用opencv调用微信扫描二维码引擎,附带windows和linux需要的动态库文件

    前言 最近公司项目有一个需求,要用二维码传递数据.于是使用了zxing生成和解析二维码,但是zxing扫描二维码原图还可以,一旦扫描用户使用手机拍摄的二维码,识别率急剧下降.尝试了对拍摄的照片进行降噪 ...

最新文章

  1. FreeBSD Ports加速的方法
  2. android内存池,两种常见的内存管理方法:堆和内存池
  3. hdu 4468 spy 极其精彩的一道kmp灵活运用题
  4. git-分支管理策略-合并分支时创建新的版本
  5. [转]Error: SQL BPA command line has encountered a problem and needs to close
  6. Makefile和Cmake的联系与区别
  7. MODULE_DEVICE_TABLE【转】
  8. MySQL 多表查询(Day43)
  9. 动态控制C4C UI元素的显示和隐藏
  10. GradientDrawable
  11. 2020年黑龙江省水稻种植分布数据
  12. Java 中foreach 的用法
  13. bodymovin输出Json动画为黑白的解决方案
  14. 密码忘了用计算机来打开,电脑开机密码忘了怎么办 用U盘修改登录密码方法
  15. Service的绑定过程
  16. 学习大数据-flink实时数据流处理
  17. 翻译之:数据页面和数据行
  18. 07-PDI(Kettle)源码编译8.2.0.0.R版本
  19. nvidia dch 驱动 与windows 不兼容_Adobe 2020系统兼容性报告,不支持视频驱动程序!完美解决方案...
  20. 小根堆创建,插入,删除,排序等操作图解

热门文章

  1. 折扇的保养方法是什么?
  2. 咸鸭蛋吃了对身体有什么好处?
  3. 没有聘礼,男友向我要一台奥迪汽车做陪嫁,房子是他婚前财产,正常吗?
  4. 单位人勾心斗角,我是老实人该怎么办?
  5. 买彩票中奖的概率是多少?
  6. 科比退役时间什么时候
  7. 现在市面上卖的贵州茅台镇原浆酒20元一瓶是什么酒?
  8. 最近为A公司提炼的经营理念之合作理念
  9. LeetCode-删除中间节点
  10. Markdown (小白可查看的)基本语法