把编译好的包含函数和变量的目标代码存储到文件中,在链接的时候让链接程序自动从文件中查找需要的代码。这个文件就是链接库,又可以分为静态链接库和动态链接库。
1. 静态链接库
链接程序从库中寻找需要的符号(函数和变量的名字),查找到就将其放入可执行文件,未查找到就报错。
使用静态库链接的程序:
(1)可执行文件中包含所有需要调用的函数代码;
(2)如果多个进程调用相同的库函数,内存中会存在多份库函数代码。
静态库lib文件其实是打包好的obj文件。
2.动态链接库
动态链接库在程序装载内存的时候才真正地把库函数代码链接进行确定它们的地址,并且在内存中只有一份代码,可以被加载到不同进程的不同地址。
生成动态链接库时一般包含3种文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).lib文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。动态链接库的lib文件与静态库不同,只包含被DLL导出的函数名称和位置,没有具体的实现,所以也叫导入库。非必需,因为可以通过其他方式实现导入库的功能,如在显式连接中,可以使用WIN 32 API函数LoadLibrary导入DLL文件,再使用GetProcAddress函数获得对应函数;或者在Qt中,使用QLibrary类。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
2.1 隐式链接与显式链接
动态链接库的调用分为隐式链接和显式链接。
2.1.1 显式链接
显式链接在程序需要用到库函数的时候再进行动态载入,需要在程序中通过某些函数来加载库和获得要使用的函数,所以是“显式”。
Windows程序有相应的函数帮助实现显式链接,Qt也有相应的类来实现。
显式链接的特点:
- 灵活性好,如果导入库或获得函数失败,程序设计的时候就可以考虑进行相应的处理。
- 程序载入速度快,在程序运行过程中,在需要时才加载dll
- 编译时不需要导入库,也不需要include头文件,只需要提供dll文件,但是要知道其中的函数信息(参数类型,返回类型)以供获取函数时使用
- 导入时需要额外的代码(加载库和函数)
- 如果在编译程序时并不能确定库和函数的名字,而是在运行时获得,就只能通过显式链接动态加载
- 因为C++类的成员函数的实际名字是修饰过的,所以调用时要使用特殊方法(目前没有研究过)
- 通过显式链接调用库的程序,在编译时是不会去管库文件的正确性的,只有运行时才能发现错误。
2.1.2 隐式链接
相应的,隐式链接中调用库函数时,就像调用本工程的函数,所以被称为“隐式”。
它的使用需要include头文件,配置库文件的查找

本文深入讲解链接库概念,包括静态链接库与动态链接库的区别,动态链接库的隐式链接与显式链接方法,以及在Qt环境下的具体实现案例。
3374

被折叠的 条评论
为什么被折叠?



