【49】C++中使用库(静态库与动态库)

库通常包含两部分,includes和library,包含目录和库目录。包含目录是一堆头文件,这样我们就可以实际使用与预构建的二进制文件中的函数。lib目录有那些预先构建的二进制文件,通常分为动态库和静态库(并不是所有库在lib库中提供了这两种库)。

静态链接意味着这个库会被放到你的可执行文件中,它在你的exe文件中或者其他操作系统下的可执行文件;而动态链接库是在运行时被链接的,所以你仍有一些链接,你可以选择在程序运行时,装载动态链接库。在windows APIs下,有一种叫做loadlibrary的函数,它可以会载入你的动态库,可以从中拉出函数,然后开始调用函数;也可以在应用程序启动时,加载dll文件。

(dll是Dynamic Link Library的缩写,意为动态链接库。 DLL文件一般被存放在C:WindowsSystem目录下。 在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。)

总之,与静态链接相比,动态链接的区别是:库文件是否被编译到exe文件中或链接到exe文件中,还是只是一个单独的文件,在运行时,你需要把它放在你的exe文件旁边或者某个地方,然后你的exe文件可以加载它。因为这种依赖性,在使用动态链接时,你需要有exe文件和dll文件(在一起)

静态链接在技术上更快,因为编译器或链接器实际上可以执行链接时优化之类的操作,静态链接在技术上可以 产生更快的应用程序,因为有几种优化方法可以应用,因为我们知道,在链接时我们要链接的函数。而对于动态库,我们不知道会发生什么,我们必须保持它的完整,当动态链接库被运行时的程序装载时,程序的部分将被补充完整。通常静态链接是最好的选择。

然而在我们使用编译器时,我们必须把它指向头文件(包含文件),这样我们就知道哪些函数是可用的,然后我们就有了这些函数声明,实际上是符号声明,因为它们也可以是变量,说到底,它们只是一种编译过的二进制文件。

头文件提供声明,告诉我们哪些函数是可用的,然后库文件为我们提供了定义,这样我们就可以链接到那些函数,并在C++函数中调用函数时执行正确的代码。

C++创建一个动态链接库,编译后会生成两个可用的文件一个是lib文件一个是dll文件,那么这个lib文件是干嘛的呢?
在使用动态库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。

1. Load-time Dynamic Linking 载入时动态链接:
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。
2. Run-time Dynamic Linking 运行时动态链接:
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Balaaam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值