静态链接库LIB和动态链接库DLL的区别,创建和示例
1.什么是静态连接库,什么是动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
1.什么是静态连接库,什么是动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
(若是想在MFC应用程序中调用动态链接库DLL,或静态链接库LIB,又或者是动态链接库DLL中要调用静态链接库LIB的接口,建议在编译链接时,所有模块(exe,dll,lib)要么都是MFC作为共享的DLL,要么都MFC作为静态链接库,或者都用标准的Windows库,总之可执行程序和DLL或LIB中的调用应保持一致。)
静态链接库与静态链接库调用规则总体比较如下:
对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定与静态库一起链接
第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)
对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数
对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定与静态库一起链接
第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)
对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数
而对于一个工程模块,我们可以将其编译成动态链接库DLL的文件形式,也可以编译成静态链接库LIB的文件。
若想条件编译的话,可以定义一个标识然后编译的时候设置这个标识一起编译。
若是有需要,想将原来以动态链接库DLL编译的模块,转换成静态链接库LIB的形式,只需要将工程里编译选项改成以静态库方式编译就行。同时修改下DLL中的导出函数的声明为普通函数声明。
同时注意,应用程序中调用静态链接库.lib时,只需要隐式的(即工程配置项里或用#pragma comment)引入.lib文件,因为静态链接库的lib就是其本身,所以这样我们就能直接调用静态链接库里的接口了。【他跟动态链接库DLL在开发角度上,不同的是,DLL需要引入的是链接文件.lib,让编译器能找到DLL中的接口,其他在使用上都一样】
在这提醒下,
静态链接库文件.lib与动态链接库DLL编译时产生的.lib链接文件是不一样的,即便它们在Windows中呈现的文件格式是一样的,动态链接文件.lib里面仅仅只是保存了一些动态链接导出函数的声明,有心的朋友,可以比较下它们的大小,你会发现,动态链接文件.lib跟静态链接库文件.lib比起来小很多。