博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
库的简介和分类
阅读量:5308 次
发布时间:2019-06-14

本文共 1416 字,大约阅读时间需要 4 分钟。

一、库的分类:

  静态库:库中代码被嵌入到可执行程序或动态库中,扩展名为“.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该库时才会报错,别的功能部分正常运行;

 

转载于:https://www.cnblogs.com/zhouwanqiu/p/6921008.html

你可能感兴趣的文章