Qt生成调用动态链接库dll

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

把编译好的包含函数和变量的目标代码存储到文件中,在链接的时候让链接程序自动从文件中查找需要的代码。这个文件就是链接库,又可以分为静态链接库和动态链接库。

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也有相应的类来实现。

显式链接的特点:

  1. 灵活性好,如果导入库或获得函数失败,程序设计的时候就可以考虑进行相应的处理。
  2. 程序载入速度快,在程序运行过程中,在需要时才加载dll
  3. 编译时不需要导入库,也不需要include头文件,只需要提供dll文件,但是要知道其中的函数信息(参数类型,返回类型)以供获取函数时使用
  4. 导入时需要额外的代码(加载库和函数)
  5. 如果在编译程序时并不能确定库和函数的名字,而是在运行时获得,就只能通过显式链接动态加载
  6. 因为C++类的成员函数的实际名字是修饰过的,所以调用时要使用特殊方法(目前没有研究过)
  7. 通过显式链接调用库的程序,在编译时是不会去管库文件的正确性的,只有运行时才能发现错误。

2.1.2 隐式链接

相应的,隐式链接中调用库函数时,就像调用本工程的函数,所以被称为“隐式”。

它的使用需要include头文件,配置库文件的查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值