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

一、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

时间: 2024-10-19 06:32:35

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

linux下把log4cxx封装成so动态库文件(一)

这是一个经常遇到的问题,在软件开发过程中,需要将某些功能封装成一个独立的模块,这样维护升级也很方便.现在我们就要把开源日志库log4cxx封装成so动态加载库文件. 在上一篇文章<log4cxx日志库RedHat下安装>中,我们已经将log4cxx安装在home/mac/log4cxx/log4cxx下了,那么接下来的操作我们就继续在这个路径下进行. 还是先tree一下/home/mac/log4cxx这个目录吧 log4cxx ---apr ---apr-util ---log4cxx 那再

java调用dll或so动态库文件(c++/c)

java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CDT(cdt-master-4.0.3)+MinGW(MinGW-5.1.4) 一:下面是java调用dll(C++) 1:下载并安装cdt :http://www.eclipse.org/cdt/downloads.php  :选择自己eclipse 支持的cdt插件,下载,并且 通过eclipse--

修改OpenSSL默认编译出的动态库文件名称

在 Windows 平台上调用动态链接库 dll 文件时,有两种方式:a) 隐式的加载时链接:使用 *.lib (导入库)文件,在 IDE 的链接器相关设置中加入导入库 lib 文件的名称,或在程序中加入预编译指令 #pragma comment (lib,”*.lib”).b) 显式的运行时链接.不使用 *.lib (导入库)文件,使用 Load Library(),GetProcAddress() 函数来加载动态库中的函数.要注意的是在导入库 lib 文件内部包含了其对应 dll 文件的名称

Makefile 编译动态库文件及链接动态库

本文为原创文章,转载请指明该文链接 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5 dynamiclib/Makefile 6 dynamiclib/dynamiclib_add.c 7 dynamiclib/dynamiclib_mul.c 8 dynamiclib/inc/dynamiclibs.h 9 dynamiclib/libs/ 1. dynamiclib目录 dynamic

Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法

原来使用Win7的32位系统,进行C#工程的开发,后来重装系统,换成了win7的64位系统 调试原来的工程,由于在其中引用了"SQLite"的32位的dll,导致在64为位下程序无法运行(但是编译可以通过) 后来通过修改工程文件(.csproj),在其中设置引用的条件,解决了问题 打开引用了SQLite的工程(例如叫做info)的工程文件(info.csproj),找到对SQLite引用的语句,类似如下的代码 代码如下: <Reference Include="Syst

Android研究之动态创建UI界面详解

 Android的基本UI界面一般都是在xml文件中定义好,然后通过activity的setContentView来显示在界面上,这是Android UI的最简单的构建方式.其实,为了实现更加复杂和更加灵活的UI界面,往往需要动态生成UI界面,甚至根据用户的点击或者配置,动态地改变UI,本文即介绍该技巧.对事件和进程的可能安卓设备实现触摸事件的监听,跨进程 假设Android工程的一个xml文件名为activity_main.xml,定义如下: 1 2 3 4 5 6 7 8 9 10 11

jquery的uploadify插件多文件上传配置参数详解

最近做了个多文件上传,需要限制上传文件类型的例子.以前没做过找了一些资料,下次有用.同时也给大家做参考. uploader: uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后淡出打开文件对话框,默认值:uploadify.swf. script: 后台处理程序的相对路径 .默认值:uploadify.php checkScript:用来判断上传选择的文 件在服务器是否存在的后台处理程序的相对路径 fileDataName:设置一个名字,在服务器处理

【linux_笔记】Linux_文件查找(find)详解&&特殊权限

学习资源来自:www.magedu.com 学习记录过程中难免出现错误,如有发现,还望大神们指出. 示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行.示例仅供参考(练习题在附录). 文件查找: locate(不常用):非实时,模糊匹配,根据全系统文件数据库进行查找,速度快:# updatedb, 手动生成文件数据库(非常耗时) find:实时,精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢: 命令格式:find 查找路径 查找标准

BAT批处理之文件与文件夹(附xcopy命令详解)

在批处理脚本中,操作文件与文件夹的方法,包括文件的复制.删除.移动等操作,并附有xcopy命令的详细用法.原文地址:http://www.jbxue.com/article/14535.html 批处理中的文件.文件夹操作,xcopy命令的用法. 一,建bat文件自动执行复制,删除命令.例1:复制cd.dll文件至windows\system32的bat文件内容:copy cd.dll %windir%\system32例2:卸载windows\system32目录中的cd.dll,即把上面复制