vc 动态链接库和静态链接库

1背景
软件开发基于模块化开发的理念,可以提高代码重用性、便于模块的测试和模块功能的维护扩充、缩短开发周期。

模块化开发在设计上的体现是模块功能的划分和模块之间内聚性、耦合性的设计。在开发技术上的体现主要是动态链接库和静态链接库的设计。

因为设计上功能需要和开发的项目密切联系,本文不加讨论。

本文主要介绍在开发技术上的体现:即介绍动态链接库和静态链接库。

2概念和区别
不论是动态链接库还是静态链接库,都是对代码封装编译生成的功能模块,这类模块不能单独执行,需要有exe执行文件调用。其代码也不可见,留有功能接口,供二次开发人员使用。

示意图如下:



上图只是简单的架构示意图,实际根据链接库的不同,调用方法也不同。

下面分别对静态和动态链接库做简单介绍。

2.1静态链接库
静态链接库的后缀名一般是.lib文件,如果你的可执行程序调用了静态链接库,那么编译后静态链接库中的代码就要链接到你的可执行程序中去,成为你可执行程序的一部分。所以调用了静态连接的可执行文件一般比较大一些。


2.2动态链接库
动态链接库是相对于静态链接库而言的,动态链接库文件的扩展名一般是dll,也有可能是drv、sys等。如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。

Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则(常规)DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用(比如被vb、delphi调用);MFC规则DLL 包含一个继承自CWinApp的类,无消息循环,可以导出函数,单不能导出类,可以被其他编成语言使用。MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。


2.3动态链接库和静态链接库的区别
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。


3 静态链接库的创建、发布及调用
3.1静态链接库

的创建
在静态库中,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。

Vc中创建静态链接库步骤如下:

1、选择菜单:File-New,打开New对话框。

2、选择projects属性页,左边列表中选择 win32 static library,然后再右边的project name中输入工程名称、在location中输入路径,如下图:


点ok,进入下一步,选择合适的选择,既可以完成该工程框架。

3、在该工程的头文件和代码文件中加入需要的功能,编译后就可以得到静态链接库文件(mathlib.lib)。

3.2 静态链接库的发布
静态链接库编译成功后,如果让其他开发人员使用,最少需要提供2个文件,即静态库的头文件和静态库lib文件。当然,成熟的静态库还应该提供说明文件(包含开发人员、日期、库功能介绍及库对外的接口等),以方便二次开发人员使用。

3.3 静态链接库的调用
要调用静态链接库,前提条件是必须先拥有库文件(.lib)和头文件,具体使用方法如下:

方法1:把库文件加入到当前工程中,在使用库中功能的代码文件中加入其头文件既可以调用库中的函数。

方法2:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib,在使用库中功能的代码文件中加入其头文件既可以调用库中的函数。

方法3:在使用库中功能的代码文件中加入其头文件,并且在加入语句:#pragma comment(lib,"..\\bin\\mathlib.lib"),保证路径正确,然后既可以调用库中函数。

因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况。


4 动态链接库的创建、发布及调用。
4.1 动态链接库的创建
动态链接库创建(nomfc)


4.2 动态链接库的发布
4.2 动态链接库的调用
对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

因此这里衍生出两个问题:
第一:如何调用?即调用的方式
第二:不同调用方式对应的库的生成过程和

调用规则

我逐步展开问题。
第一,存在两种调用方式——动态调用和静态调用
第二,两种调用方式的库的生成过程和调用规则
1〉动态调用

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 __declspec(dllexport) 函数名(参数表);
在调用程序的.cpp源代码文件中按如下流程调用:
在main函数代码的开始处
定义需要的DLL模块的句柄和此DLL模块模块中需要调用的函数的函数指针。
定义好后紧接着就是标准的三部曲:
取得需要的DLL模块------>返回模块句柄
LoadLibrary("DLL模块路径")
取得需要的函数地址———>返回函数指针GetProcAddress(模块句柄,"函数名")
从内存中卸载DLL模块———>FreeLibrary(模块句柄)
2>静态调用
在调用程序的.cpp源代码文件中按如下流程调用:
#include.........
告诉编译器与 DLL 相对应的.lib 文件所在的路径及文件名
#pragma comment(lib,"路径和文件名")
extern "C" 函数返回类型 _declspec(dllimport) 函数名(参数表)分号
int main()
{
..............
}

相关主题
相关文档
最新文档