演练:创建和使用动态链接库
- 格式:docx
- 大小:32.55 KB
- 文档页数:6
Linux下使用动态链接库和静态链接库的项目建立及单步调试预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制Linux下使用动态链接库和静态链接库的项目建立及单步调试在Linux下程序的主要调试工具是gdb,如喜欢用图形界面,可用insight。
下面对动态链接库和静态链接库的单步调试就是采用gdb+insight来完成的。
一、动态链接库的建立和单步调试1、采用动态链接库的项目的建立准备编写两个函数,一个用于查询当前日期getdate,一个用于查询当前时间gettime,并将这两个函数存于动态链接库my.so中。
为此,需要做以下几项工作。
1.1 编写用户接口文件datetime.h/* datetime.h : 纵横软件制作中心雨亦奇编写, 2001-06-28. */ #ifndef __DA TETIME_H#define __DA TETIME_H/* 日期结构*/typedef struct{int year;int mon;int day;}DA TETYPE;/* 时间结构*/typedef struct{char hour;char min;char sec;}TIMETYPE;/* 函数原型说明*/#ifdef SHAREDint (*getdate)(DA TETYPE *d);#elseint getdate(DA TETYPE *d);#endif#ifdef SHAREDint (*gettime)(TIMETYPE *t);#elseint gettime(TIMETYPE *t);#endif#endif1.2 编写getdate.c,源程序如下:* getdate.c : 纵横软件制作中心雨亦奇编写, 2001-06-28. */#include "time.h"#include "datetime.h"int getdate(DA TETYPE *d){long ti;struct tm *tm;time(&ti);tm=localtime(&ti);d->year=tm->tm_year+1900;d->mon=tm->tm_mon+1;d->day=tm->tm_mday;}在getdate函数中,先调用time取得以秒计的系统时间,再用localtime函数转换一下时间结构,最后调整得到正确的日期。
动态链接库教程动态链接库(Dynamic Link Library,简称DLL)是一种可由多个程序共享的库文件,它包含了一组函数和数据,可以在程序运行时加载和调用。
DLL 文件可用于将一些通用的功能封装成函数,供多个程序调用,从而提高代码的复用性和开发效率。
本文将详细介绍动态链接库的概念、使用方法以及制作过程。
一、动态链接库的概念动态链接库是一种包含了函数和数据的库文件,它可以在程序运行时被加载和调用。
与静态链接库相比,动态链接库的优势在于节省内存空间和提高代码的复用性。
当多个程序需要使用同一个功能时,它们可以共享同一个DLL文件,避免了重复编写相同的代码。
二、动态链接库的使用方法在使用动态链接库之前,我们首先需要了解动态链接库的编译、加载和调用过程。
1.编译动态链接库在创建 DLL 文件时,我们需要按照一定的规范编写代码,并将其编译成 DLL 文件。
编译时,需要指定导出函数的修饰符(如 _stdcall、_cdecl等),以及导出函数的声明。
这些步骤可以在开发环境(如Visual Studio)中完成。
2.加载动态链接库在程序运行时,需要加载 DLL 文件。
我们可以通过调用LoadLibrary 函数来加载 DLL,该函数返回一个句柄,表示 DLL 的实例。
加载 DLL 文件后,我们可以通过该句柄获取 DLL 中导出函数的地址。
3.调用动态链接库在获取到DLL中导出函数的地址后,我们可以通过函数指针来调用DLL中的函数。
通过函数指针,程序可以跳转到DLL中执行指定的函数,从而完成相应的功能。
三、制作动态链接库下面以C++语言为例,简单介绍如何制作一个动态链接库。
1.创建DLL工程在 Visual Studio 中创建一个 DLL 项目,选择 DLL(动态链接库)作为项目类型。
在项目中添加需要导出的函数,并在头文件中进行声明。
2.编写导出函数在 DLL 项目中编写需要导出的函数,并在函数前添加修饰符(如_stdcall、_cdecl等)。
1.新建MFC DLL工程,取名为:DLL0410
动态链接库的创建和调用(类,函数的DLL导出和调用)
2.在工程中编辑好DLL0410.h,DLL0410.cpp,DLL0410.def三个文件后编译生成对应的dll和lib文件
2.1 DLL0410.h
2.2 DLL0410.cpp
2.3 DLL0410.def
2.4 编辑好上面的3个文件编译后,用dumpbin命令查看是否有函数导出。
(如图所示,sub全局函数和add类的成员函数已经导出)
3.新建一个工程DLL0410test将生成的DLL0410.dll,DLL0410.lib以及DLL0410.h文件拷贝到 DLL0410test工程目录下
4.静态调用:在工程的DLL0410test.cpp文件中导入头文件DLL0410.h,并编写对应的静态调用代码。
同时也要在工程属性链接中加入DLL0410.lib文件。
(如果编译出错有可能是,工程属性中的常规>>字符集>>修改为 使用多字节字符集)
运行成功
5.4.动态调用:只需将生成的DLL0410.dll文件拷贝到新建工程目录下,直接在工程的
DLL0410test.cpp中编写动态调用代码即可。
不用做其他任何连接和导入头文件的操作。
运行成功。
动态链接库的建立与调用姓名:蒙吉学号:20072411603实验名称:动态链接库的建立与调用实验目的:1)理解动态链接库的实现原理;2)掌握WINDOWS系统动态链接库的建立方法;3)掌握WINDOWS环境下动态链接库的调用方法。
实验准备知识:1)动态链接库基础知识;2)动态链接库入口函数(DllMain);3)动态链接库导入/导出函数:声明导出函数的代码:_declspec(dllexport) MyDllFunction(int x,int y);声明导入函数的代码:_ declspec(dllexport) MyDllAdd(int x,int y);4):隐式连接和显式连接;5)函数调用参数传递约定:(1)_stdcall调用约定;(2)C调用约定;(3)_fastcall调用约定。
实验内容:1)在WINDOWS环境下建立一个动态链接库;2) 使用隐式调用法调用动态链接库;3)使用显式调用法调用动态链接库;实验要求:掌握动态链接库建立和调用方法。
在WINDOWS XP+VC++6.0环境下建立一个动态链接库,并分别使用隐式和显式将其调用,从而体会使用动态链接库的优点。
参考源代码:// SimpleDll.cpp:Defines the entry point for the DLL application.#include "stdafx.h"extern"C"_declspec(dllexport) int Add(int x,int y);extern"C"_declspec(dllexport) int Sub(int x,int y);BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){return TRUE;}int Add(int x,int y){int z;z=x+y;return z;}int Sub(int x,int y){int z;z=x-y;return z;}//隐式调用动态链接库的程序//CallDll.cpp:Defines the entry point for the consile application.#include"stdafx.h"extern"C"_declspec(dllimport) int Add(int x,int y);extern"C"_declspec(dllimport) int Sub(int x,int y);int main(int argc,char* argv[]){int x=7;int x=6;int add=0;int sub=0;printf("Call Dll Now!\n");//调用动态链接库add=Add(x,y);sub=Sub(x,y);printf(" 7+6=%d,7-6=%n",add,sub);return 0;}//显示调用动态链接库的程序//CallDllAddress.cpp:Defines the entry point for the console application. #include"stdafx.h"#include"CallDllAddress.h"#ifdaf_DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS__FLLE[]=__FILE__;#endif/////////////////////////////////////////////////////////////////The one and only application objectCWinApp theApp;using namespace std;int_tmain(int argc,TCHAR* argv[], TCHAR* envp[]){int s;int nRetCode=0;typedef int (*pAdd) (int x,int y);typedef int (*pSub) (int x,int y);HMODULE hDll;pAdd add;pSub sub;hDll=LoadLibrary("SimpleDll.dll"); //加载动态链接库文件SimpleDll.dll if(hDll==NULL){printf("LoadLobrary Error......\n");return nRetCode;}else printf("LoadLibrary Success......\n");add=(pAdd)GetprocAddress(hDll,"Add"); //得到动态链接中函数Add ()的内部地址s=add(6,2);printf("6+2=%d\n",s);sub=(pSub)GetprocAddress(hDll,"Sub");//得到动态链接库中函数Sub ()的内部地址s=sub(6,2);printf("6-2=%d\n",s);FreeLibrary(hDll); //释放动态链接库SimpleDll.dllreturn nRetCode;}。
VC6.0如何创建以及调⽤动态链接库实例详解⼩弟在公司的职责,在上篇博客中已经简约介绍。
这边博客主要介绍技术的应⽤⽽不在细究原理。
因为公司项⽬着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上⼿⼯作,搞出demo来最好。
⾄于公司⼯作情况,今天暂且略过,当然也不是⼀两句能够表达清楚的。
后⾯会有相应的⼯作总结,敬请期待……现在,废话少说,直奔主题——VC6.0中创建动态链接库。
作为客户与后台的中介,为了更好的调节两⽅的关系,我明智滴选择了webservice以及动态链接库。
在与客户c++使动态链接库⽅式,⽽与后台java,使⽤webservice来交流沟通。
既然有了动态链接库,肯定⼤家会想到静态链接库。
呵呵,这个是相对的。
那这两者有什么区别呢?那⼜为静态链接库:是把lib⽂件也打包到了exe⽂件中。
动态链接库:没有把lib⽂件打包到exe⽂件中,若是使⽤,则直接加载卸载相应的dll⽂件。
并且,静态链接库中不允许包含静态链接库和动态链接库,⽽动态链接库中是允许包含静态链接库和动态链接库的。
因为⼩弟封装的dll中是调⽤客户的dll,并且有可能包含另外⾃⼰的动态链接库。
鉴于此,⼩弟选择了动态链接库。
还有⼀点是,动态链接库,也是分为三种情况的。
⼀是⾮MFC的dll(也就是控制台的dll),⼆是常规的MFC的dll(其中⼜分静态的dl和共享的dll),三是扩展的MFC 的dll。
并且MFC的dll可以被MFC程序或者控制台程序调⽤。
因为⼩弟封装的dll,需要供MFC程序调⽤,所以选择使⽤了MFC常规的dll。
并且使⽤控制台程序做测试。
⾸先,在新建⼯程中选择MFC AppWizard (dll)然后在头.h⽂件中,声明被外界调⽤的函数复制代码代码如下:extern "C" _declspec(dllexport) char* queryFunctionByFID(char* funcId);声明后,在cpp⽂件中,实现此函数。
Visual studio c++ 2017 动态链接库的创建和使用总结一动态链接库的创建两种方式:1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接库(.dll)->生成解决方案,才会生成.dll和.lib文件。
(1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。
可以看出,导出的函数名都被编译器篡改了。
(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。
可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。
类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。
2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。
二动态链接库的调用两种方式:1、显式调用(1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。
否则GetProcAddress( )不能正确地获取dll中的函数名。
但是导出的类不能使用extern “C”修饰。
(2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。
必须事先知道dll中的函数名和形式参数。
(3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。
类封装成dl l如果你的工作长期与某个领域相关,比如说长期做直接体绘制(DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件添加进去会比较麻烦,其实,我们可以像使用open gl 的库那样来用你自己的类,做法就是把你写好的类封装成dll,具体做法如下:第一步:制作dll利用VC6新建工程时选择win32 dynami c-Link L ibrar y(空的工程),然后添加头文件和cpp文件。
假设你要封装的类的名成是T ran sferF uncti on,添加头文件T ransf erFun ction.h和Tran sferF uncti on.cpp 到工程中。
并将Tran sferF uncti on.h修改成:class__decl spec(dllexp ort)Transf erFun ction { ... }从而说明以后从dll要被导出的类是哪一个。
这样编译完就会产生Tr ansfe rFunc tion.dll和Tr ansfe rFunc tion.lib两个文件。
第二步:如何使用这个d ll 当已经生成d l l后,有两种方法可以在其它程序中调用d l l中的类和成员函数:方法一:1)把Trans ferFu nctio n.dll和Tr ansfe rFunc tion.lib复制到调用程序的执行路径下,注意不是de bug路径下。
2)在proje ct->settin g->lin k里添加Tran sferF uncti on.lib(或者用#pragma commen t(lib, "Transf erFun ction.lib") )3)把Trans ferFu nctio n.h中的__d eclsp ec(dllexp ort)改成__de cls pe c(dllimp ort) 然后复制到调用程序的执行路径下。
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。
面对比一下两者:静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
动态库而言:某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。
如果有,则让其共享那一个拷贝;只有没有才链接载入。
在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。
因此,这些代码必须使用相对地址,而不是绝对地址。
在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。
注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
一.静态库下面就通过实际的例子来向大家演示一下,该怎样编译和使用静态和动态链接库:1. 编辑测试文件二个文件:add.c、sub.c、add.h 、sub.h 和main.c/*add.h */#ifndef _ADD_H_#define _ADD_H_int add(int a, int b);#endif-------------------------------------------------------------------------------------------------/*add.c*/#include "add.h"int add(int a, int b){return a+b;}------------------------------------------------------------------------------------------------- /*sub.h*/#ifndef _SUB_H_#define _SUB_H_int sub(int a, int b);#endif------------------------------------------------------------------------------------------------- /*sub.c*/#include "add.h"int sub(int a, int b){return a-b;}------------------------------------------------------------------------------------------------- /*main.c*/#include <stdio.h>#include "add.h"#include "sub.h"int main(void){printf("1 + 2 = %d\n", add(1, 2));printf("1 - 2 = %d\n", sub(1, 2));return 0;}------------------------------------------------------------------------------------------------- 2.将add.c 和sub.c 编译生成.o文件gcc -c add.cgcc -c sub.c生成的文件:sub.o ,add.o无论是静态库文件还是动态库文件,都是由.o 文件创建的。
1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念.你可以简单的把DLL看成一种仓库.它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式.如果采用静态链接库.则无论你愿不愿意.lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL.该DLL不必被包含在最终EXE文件中.EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库.而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库.我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式.用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API).在任何开发环境中都能被调用.不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll.windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数.其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL.它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL (MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
MFC创建动态链接库DLL并调⽤⽅法详解实例⼀:1、创建⼀个动态链接库⼯程,如login_dll。
2、在原⼯程头⽂件或者新建头⽂件如showdlg.h定义动态链接库的导出函数,代码如下:#include "stdafx.h"#define EXPORT __declspec(dllexport)extern "C" EXPORT void __stdcall Showdialg(char* pText);3、在动态链接库源⽂件中定义showdialog函数,代码如下:void _stdcall Showdialg(char* pText){MessageBox(NULL,pText,"提⽰⼀",0);}注:此步编译后,即可⽣成dll与lib⽂件,因为_stdcall是⼀种⽐较流⾏的函数调⽤约定,(或者可以不⽤_stdcall),如果使⽤的时候,为了防⽌发⽣函数命令改编的情况,可以定义⼀个.def⽂件,其中加⼊EXPORTS节,设置导出函数名,如下所⽰:LIBRARY "login_dll"EXPORTSShowdialg = Showdialg4、创建⼀个基于对话框的⼯程。
5、定义⼀个函数指针类型,其定义与动态链接库的函数原型相同,代码如下:typedef void (__stdcall * funShowInfo)(char* pchData);6、处理按键单击事件,加载动态链接库,代码如下:void Cuse_login_dllDlg::OnBnClickedOk(){HMODULE hMod = LoadLibrary("login_dll.dll");if (hMod != NULL){funShowInfo ShowInfo;ShowInfo = (funShowInfo)GetProcAddress(hMod,"Showdialg");if (ShowInfo)ShowInfo("传⼊参数成功且调⽤正常");}FreeLibrary(hMod);}其中,第5步与第6步是通过LoadLibrary函数动态加载链接库的⽅法,下⾯介绍⼀下静态加载链接库的⽅法:1、加载链接库的头⽂件,将动态链接库头⽂件拷贝到当前⼯程中,并在当前⼯程头⽂件进⾏声明。
创建和使用动态链接库(C++)Visual Studio 2008其他版本使用动态链接代替静态链接有若干优点。
DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。
在本演练中,您将创建一个动态链接库(DLL),其中包含可供其他应用程序使用的有用例程。
使用DLL 是一种重用代码的绝佳方式。
您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。
我们将创建的第一种类型的库是动态链接库(DLL)。
使用DLL 是一种重用代码的绝佳方式。
您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。
本演练涵盖以下内容:∙创建新的动态链接库(DLL) 项目。
∙向动态链接库添加类。
∙创建引用动态链接库的应用程序。
∙在控制台应用程序中使用类库的功能。
∙运行应用程序。
先决条件本主题假定您具备C++ 语言的基础知识。
创建新的动态链接库(DLL) 项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.在“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsDll”,并将其键入“名称”字段。
为解决方案选择一个名称,如“DynamicLibrary”,并将其键入“解决方案名称”字段。
5.单击“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。
6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。
某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。
您可以稍后对此进行更改,以将项目编译为DLL。
7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。
8.单击“完成”创建项目。
向动态链接库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
在“类别”窗格中,选择“Visual C++”下的“代码”。
在“模板”窗格中选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsDll.h”,并单击“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:复制// MathFuncsDll.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic __declspec(dllexport) double Add(double a, double b);// Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);// Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);};}3.请注意此代码方法声明中的__declspec(dllexport) 修饰符。
这些修饰符使DLL 能够导出该方法以供其他应用程序使用。
有关更多信息,请参见dllexport, dllimport。
4.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
在“类别”窗格中,选择“Visual C++”下的“代码”。
在“模板”窗格中,选择“C++ 文件(.cpp)”。
为源文件选择一个名称,如“MathFuncsDll.cpp”,并单击“添加”。
将显示一个空白文件。
5.在源文件中实现“MyMathFuncs”的功能。
代码应与以下内容类似:复制// MathFuncsDll.cpp// compile with: /EHsc /LD#include "MathFuncsDll.h"#include <stdexcept>//标准异常类using namespace std;namespace MathFuncs{double MyMathFuncs::Add(double a, double b) {return a + b;}double MyMathFuncs::Subtract(double a, double b){return a - b;}double MyMathFuncs::Multiply(double a, double b){return a * b;}double MyMathFuncs::Divide(double a, double b){if (b == 0){throw new invalid_argument("b cannot be zero!");}return a / b;}}6.若要将项目生成为DLL,请从“项目”菜单中选择“MathFuncsDll,再选择“属性…”。
在左窗格中,选择“配置属性”下的“常规”。
在右窗格中,将“配置类型”更改为“动态库(.dll)”。
单击“确定”保存更改。
说明:7.编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。
这样就创建了一个可供其他程序使用的DLL。
有关DLL 的详细信息,请参见DLL。
创建引用动态链接库的应用程序1.若要创建将引用并使用刚创建的动态链接库的应用程序,请从“文件”菜单中选择“新建”,然后选择“项目...”。
2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.在“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称(如“MyExecRefsDll”),并将其键入“名称”字段。
从“解决方案”旁边的下拉列表中选择“添入解决方案”。
这会将新项目添加到该动态链接库所属的同一个解决方案中。
5.单击“确定”启动“Win32 应用程序向导”。
在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。
6.在“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“控制台应用程序”。
7.在“Win32 应用程序向导”的“应用程序设置”页中,清除“附加选项”下的“预编译头”复选框。
8.按“完成”创建项目。
在控制台应用程序中使用类库的功能1.创建新的控制台应用程序后,将为您创建一个空程序。
源文件的名称与您在前面为项目选择的名称相同。
在本示例中,名为“MyExecRefsDll.cpp”。
2.若要使用在动态链接库中创建的算术例程,则必须引用该库。
为此,请选择“项目”菜单中的“引用…”。
在“属性页”对话框中展开“通用属性”节点,选择“引用”,然后选择“添加新引用...”按钮。
有关“引用...”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”。
3.显示“添加引用”对话框。
此对话框列出了所有可以引用的库。
“项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。
在“项目”选项卡中,选择“MathFuncsDll”。
然后单击“确定”。
有关“添加引用”对话框的更多信息,请参见“添加引用”对话框。
4.若要引用动态链接库的头文件,必须修改包含目录路径。
为此,请在“属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“常规”。
在“附加包含目录”旁边,键入“MathFuncsDll.h”头文件所在位置的路径。
5.可执行文件仅在运行时加载动态链接库。
必须告诉系统在哪里查找“MathFuncsDll.dll”。
您可以通过使用PATH环境变量做到这一点。
为此,请在“属性页”对话框中展开“配置属性”节点,并选择“调试”。
在“环境”旁边键入以下内容:PATH=<MathFuncsDll.dll 文件的路径>,其中<MathFuncsDll.dll 文件的路径> 应替换为“MathFuncsDll.dll”的实际位置。
单击“确定”保存所有更改。
说明:6.现在,可以在应用程序中使用“MyMathFuncs”类了。
使用以下代码替换“MyExecRefsDll.cpp”的内容:复制// MyExecRefsDll.cpp// compile with: /EHsc /link MathFuncsDll.lib#include <iostream>#include "MathFuncsDll.h"using namespace std;int main(){double a = 7.4;int b = 99;cout << "a + b = " <<MathFuncs::MyMathFuncs::Add(a, b) << endl;cout << "a - b = " <<MathFuncs::MyMathFuncs::Subtract(a, b) << endl;cout << "a * b = " <<MathFuncs::MyMathFuncs::Multiply(a, b) << endl;cout << "a / b = " <<MathFuncs::MyMathFuncs::Divide(a, b) << endl;return 0;}7.通过从“生成”菜单中选择“生成解决方案”,生成可执行文件。
运行应用程序1.确保选择“MyExecRefsDll”作为默认项目。
在“解决方案资源管理器”中,选择“MyExecRefsDll”,然后选择“项目”菜单中的“设为启动项目”。
2.若要运行项目,请选择“调试”菜单中的“开始执行(不调试)”。
输出应该与下面的内容类似:复制a +b = 106.4a -b = -91.6a *b = 732.6a /b = 0.0747475。