一、库的分类:
静态库:库中代码被嵌入到可执行程序或动态库中,扩展名为“.lib”
动态库:库中代码不被嵌入到可执行程序或其它动态库中,只在运行时加载,扩展名为“.dll”
简介:
1)由于静态库是将代码嵌入到使用程序中,多个程序使用时,会有多份代码,所以代码体积会增大,但是程序运行效率较高。动态库代码只需一份,其它程序通过函数地址以共享方式使用动态库中的代码,所以体积小。
2)静态库发生变化后,新的代码需要重新链接(嵌入)到使用程序中。动态库发生变化后,只要函数的接口(函数名+参数表+返回类型)未发生变化,使用该动态库的程序无需重新链接。
3)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库
4)我们在Windows目录下的system32文件夹中会看到kernel32.dll(处理内存管理和进程调度)、user32.dll(控制用户界面)和gdi32.dll(负责图形操作),windows的大多数API都包含在这些DLL中。
5)VC中动态库分为三种,分别是:Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)
二、库的调用
1、对静态库的调用,须用“#pragma coment(lib,".lib文件的相对路径")”来通知链接器寻找库的路径,C++程序调用C语言静态库(.c生成的.lib)/C语言动态库(.c生成的.dll .lib)中的函数时,须在进行函数声明时在函数原型的前面加上:extern "C";对于动态库的调用,动态库中的函数/类须导出,而在调用动态库中的函数/类时须导入,须将生成的动态库文件(.dll)与调用程序的执行文件(.exe)放在同一目录下,程序才可运行。
2、C++程序在调用C语言库(C语言静态库/C语言动态库(静态调用时))、C++库(C++静态库/C++动态库(静态调用时))中的函数时,须进行函数声明。
3、动态库中函数的导出方式有:“_declspec(dllexport)声明导出”和“模块定义文件.def”两种,而动态库中类的导出只能使用“_declspec(dllexport)声明导出”方式。
导出方式比较:
“模块定义文件.def”可以为动态库中的函数指定序号,即便日后修改了动态库中的代码,导致其中函数的名称及入口地址发生了改变,但只要其序号保持不变,仍可以在不重新链接的情况下,被正确地调用;
4、对于动态库的调用分为:静态调用(隐式链接)/动态调用(显式链接);静态调用动态库中的函数时,须在函数原型前加“_declspec(dllimport)”导入函数,静态调用动态库中的类时,可以用类导出的宏开关;动态调用动态库中的函数时,使用动态加载步骤。
调用方式比较:
动态调用不需要导入库,因此只要函数接口(函数名+形参表+返回类型)不变,动态库做任何修改都不需要重新链接;若程序使用静态调用的动态库不存在,则程序无法启动,而动态调用只有在LoadLibrary该库时才会报错,别的功能部分正常运行;