使用VS2008创建和调用动态链接库_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 使用VS2008创建和调用动态链接库

使用VS2008创建和调用动态链接库

 2013/6/19 11:18:54  chenqiang5206  程序员俱乐部  我要评论(0)
  • 摘要:1.什么是动态链接库Adynamiclibraryconsistsofroutinesthatareloadedintoyourapplicationatruntime.Whenyoucompileaprogramthatusesadynamiclibrary,thelibrarydoesnotbecomepartofyourexecutable—itremainsasaseparateunit.动态链接库是一个函数和变量的集合,在调用它的程序运行时才被加载。因此
  • 标签:创建 使用

1.?什么是动态链接库

?A?dynamic?library?consists?of?routines?that?are?loaded?into?your?application?at?run?time.?When?you?compile?a?program?that?uses?a?dynamic?library,?the?library?does?not?become?part?of?your?executable?—?it?remains?as?a?separate?unit.

动态链接库是一个函数和变量的集合,在调用它的程序运行时才被加载。因此,动态链接库和可执行程序是分离的。

使用动态链接库具有以下优点:(1)?隐藏源代码;(2)实现代码重用;(3)当程序调用DLL中的函数时不需要重新编译,提高编译速度;(4)当多个程序调用同一DLL中函数时,内存中只有一个副本,节省内存空间;(4)可通过替换DLL来实现程序的维护和升级。

当在应用程序中加载DLL时,有两种方法来调用导出的DLL函数,它们分别为加载时动态链接和运行时动态链接。

在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。

在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,无需使用导入库文件。

?可以根据下面的?准则来判断使用哪一种链接方式。

??(1)启动性能?如果应用程序的初始启动性能很重要,则应使用运行时动态链接。

??(2)易用性?在加载时动态链接中,导出的?DLL?函数类似于本地函数。这使您可以方便地调用这些函数。

??(3)应用程序逻辑?在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。在开发多语言版本时,这一点很重要。

?

2.??创建动态链接库

2.1?打开Visual?Studio?2008,File?->?New?->?Project…,选择Win32?Console?Application,Name设置为myDllTest。


?

2.2?Application?type设置为Dll,勾选Empty?project,单击Finish按钮。

?

2.3?新建myDllTest.h文件,内容如下:

#ifndef?MY_DLL_TEST_H

#define?MY_DLL_TEST_H

?

#ifdef?EXPORTING_DLL

#define?API_TYPE?__declspec(dllexport)

#else

#define?API_TYPE?__declspec(dllimport)

#endif

?

API_TYPE?double?my_add(double?x,?double?y);

API_TYPE?double?my_subtract(double?x,?double?y);

API_TYPE?double?my_times(double?x,?double?y);

?

#endif

?

2.4?新建myDllTest.h文件,内容如下:

#include?"myDllTest.h"

#define?EXPORTING_DLL

double?my_add(double?x,?double?y)

{

??????return?x?+?y;

}

?

double?my_subtract(double?x,?double?y)

{

??????return?x?-?y;

}

?

double?my_times(double?x,?double?y)

{

??????return?x?*?y;

}

?

2.5?分别在Debug和Release模式下编译,这时在文件夹myDllTest\Debug和myDllTest\Release内都有myDllTest.dll和myDllTest.lib文件,将myDllTest\Debug里面的myDllTest.lib重新命名为myDllTestd.lib。只需保留myDllTest\Release中的dll文件。

?

2.6?myDllTest.dll,myDllTestd.lib,myDllTest.lib和myLibTest.h是我们最终交付给用户的文件。

?

3.?使用加载时动态链接方式调用动态链接库

3.1?如果工程比较大,则可以在本地硬盘的其它位置新建一个文件夹,命名为myDllTest,再新建三个子文件夹bin,include和lib,将DLL文件放到bin中,H文件放到include中,LIB文件放到lib中。然后打开环境变量编辑器(在开始里面直接输入编辑系统环境变量,然后搜索即可)。新建环境变量myLibTest,变量值为myDllTest文件夹所在目录。然后编辑Path环境变量,添加语句%myDllTest%\bin;(不同的语句用;间隔)。

?

3.2??打开Visual?Studio?2008,Tools?->?Options?->?Projects?and?Solutions?->?VC++?Directories,在右端的Show?directories?for下拉列表中选择Include?files,添加记录$(myDllTest)\include。然后选择Library?files,添加记录$(myDllTest)\lib。单击OK按钮,然后重启电脑。

?工程比较小时,可将DLL,H和LIB文件直接复制到当前工程下,不需要添加环境变量。这时在包含对应头文件时应当使用双引号而不是尖括号。

?

3.3??新建一个工程,此处假设为Win32?Console?Application,新建文件main.cpp,内容如下:

?#include?<iostream>

#include?<myDllTest.h>

?

using?namespace?std;

?

#ifdef?_DEBUG

#pragma?comment(lib,?"myDllTestd.lib")

#else

#pragma?comment(lib,?"myDllTest.lib")

#endif

?

int?main(int?argc,char?**argv)

{

????

?????double?x?=?2.5;

?????double?y?=?1.7;

?

?????cout?<<?x?<<?"?+?"?<<?y?<<?"?=?"?<<?my_add(x,?y)?<<?endl;

?????cout?<<?x?<<?"?-?"?<<?y?<<?"?=?"?<<?my_subtract(x,?y)?<<?endl;

?????cout?<<?x?<<?"?*?"?<<?y?<<?"?=?"?<<?my_times(x,?y)?<<?endl;

?

?????return?0;

}

也可以在Project?->?Properties中添加相应的Additional?Dependences,如下所示。Debug模式下添加Debug模式下编译的LIB文件,Release模式下添加Release模式下编译的LIB文件。

?

3.4?按下快捷键Ctrl+5,编译程序,输出以下结果。

?

注1:生成应用程序后,把所需要的DLL文件复制到程序所在目录下。否则会出现以下错误

发表评论
用户名: 匿名