VC++ 链接库(一)基本概念
来源:互联网 发布:明星拼图软件 编辑:程序博客网 时间:2024/06/11 04:06
首先介绍一些概念,然后介绍如何的创建静态链接库和动态链接库。
(一)动态链接库和静态链接库
1. 静态库
函数和数据被编译进一个二进制文件(通常扩展名为.lib)。在使用静态库的情况下,在编译连接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe文件);当发布产品的时候,只需要发布这个可执行文件,并不需要发布被使用的静态库。
2. 动态库
在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。虽然引入库的后缀也是lib,但是动态库的引入库和静态库文件有着本质的不同。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需要的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中的导出的函数;在发布产品时,除了发布可执行文件以外,还有同时发布该程序将要调用的动态链接库。
动态链接库通常不能直接运行,也不能接收消息。只有在其他模块调用动态链接库中的函数时,它才发挥作用。实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他程序调用。
注:上面说的可能有点绕,简单概括:静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
(二)三种不同的DLL
Visual C++支持三种DLL,它们分别是非MFC动态库(Non-MFC DLL)、MFC规则DLL(MFC Regular DLL)、MFC扩展DLL(MFC Extension DLL)。
1. 非MFC动态库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。
在VC++6.0中,File-->New-->Win32 Dynamic-Link Library创建非MFC动态库。
2.常规DLL:和下述的扩展DLL一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。
常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。
在VC++6.0中,File-->New-->MFC AppWizard[dll],接着有三个选项:
Regular DLL with MFC statically linked是创建一个常规的动态链接库,该DLL使用MFC的静态链接;
Regular DLL using shared MFC DLL是创建一个常规的动态链接库,该DLL使用共享的MFC DLL;
MFC Extension DLL是创建一个扩展的MFC DLL。
3. 与常规DLL相比,使用扩展DLL用于导出增强 MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。
扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。
扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。
- VC++ 链接库(一)基本概念
- 深入浅出VC++串口编程(一) 基本概念
- VC++动态链接库(DLL)编程(一)
- VC++动态链接库(DLL)编程(一)
- VC++动态链接库(DLL)编程(一)
- VC++动态链接库(DLL)编程(一)
- VC++ 动态链接库 (DLL) 编程(一)
- VC DLL 动态链接库(一)
- 动态链接库与主程序交互之[MFC] VC++动态链接库资源调用(一)
- 【vc】VC++动态链接库(DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程(一)――理解库
- VC++动态链接库(DLL)编程(一)――理解库
- 学习vc++动态链接库的(dll)很好的一课
- VC++动态链接库((DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程深入浅出(一)
- VC++动态链接库((DLL)编程深入浅出((一)
- VC++动态链接库(DLL)编程深入浅出(一)
- 用Intent传递图片
- 哈工大编译原理第一次实验--词法分析(Java版本)
- java程序员推荐书籍
- 黑马程序员_单例设计模式
- 关于QT assistant在windows下单独运行无内容的解决办法
- VC++ 链接库(一)基本概念
- 【条款12】Copy all parts of an object
- 汇编知识总结--第一部分
- 深入理解Javascript闭包
- 关于CCAction方法
- 摆脱“悬赏”束缚,知识交易平台朝电商领域进发
- MYSQL 常见错误
- 汇编知识总结--第二部分(判断指令是否正确)
- 构建基本的嵌入式Linux根文件系统