关于静态链接库和动态链接库

时间:2014.06.26

地点:基地

————————————————————————---------------

一、简述所谓的库文件

    每一个lib文件就是若干个函数的集合(假如只包含函数的话)。lib库有两种,一种库是包含了函数所在的DLL文件和文件中函数位置的信息,称为导出库;还一种是包含函数代码本身。
    lib又有静态lib和动态lib之分,静态lib将导出声明和实现都放在lib中,编译后所有代码嵌入到宿舍程序。而动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明,编译后只是将导出声明部分编译到宿主程序中,运行时需要想要的dll文件支持。

    静态链接就是把lib文件中用到的函数代码直接链接到目标程序中,程序运行时无需其他库文件。而动态链接就是把调用的函数所在文件模块dll和调用函数在文件中的位置等信息链接到目标程序,程序在运行时再从dll中寻找相应的函数代码,需要dll文件的支持。

   静态链接库和动态链接库都是共享代码的方式,采用静态链接库时,无论愿意不愿意,lib中的代码都全部直接包含到最终生成的exe文件中,但若使用的是动态链接库,则dll不必被包含在最终的exe文件中,只是exe文件在执行时可以动态地根据需要引用和卸载与该exe文件独立开来的dll文件,静态链接和动态链接的另一个区别即是静态链接库中不能再包含其他动态链接库或静态链接库,这个层次是只有一层的,而动态链接库中还可以再包含其他动态链接库或静态链接库,是可多层次的。

————————————————————————---------------

二、库的调用

    通过#include包含函数声明的头文件后,应用程序就可以使用lib文件中的函数,还要指定编译器链接相应的库文件,在IDE环境下,一般一次指定所有要用到的库文件,编译器会自动寻找每个模块所需要的库,而在命令行编译环境下,则需要指定每个某调用的库。

2.1对静态链接库的调用

1.首先,静态链接库的使用需要库的开发者提供生成库的.h文件和lib文件
2.生成的.h头文件中的声明格式如下:
extern "C" 函数返回类型  函数名(参数列表)
3.在调用程序的.cpp源代码时文件中如下格式:
#include "...\lib.h"
#pragma comment(lib,"...\\debug\\libTest,lib")

需要说明的是静态链接库时将全部指令都包含到调用程序生成的exe文件中,因此,也就不存在从静态链接库中导出某个函数给用户使用的情况,要就得全要,不要就得全不要。

2.2动态链接库的调用

根据动态链接库的调用方法不同需提供不同的资源

2.2.1.静态加载

程序静态编译时就静态导入dll,这样需提供.lib文件和.dll文件和.h文件,于是:
程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行
由于载入的是整个dll,需要耗费更多的资源
调用方式如下:
#include "...\lib.h"
#pragma comment(lib,"...\\debug\\libTest.lib")
这种方式可以调用类方法

2.2.2.动态加载

  只需要提供dll文件,此时程序若想调用dll中的某个函数时就要以某种形式或方法指明它到底想要调用哪一个函数,但这样无法调用类方法。
  我们知道cpp文件是源代码,而库文件时编译后的二进制代码,比如调用windows的API,但是这是看不到源代码的。这便是调用静态链接库和直接给出函数定义和头文件的区别。还有就是静态链接库中lib文件只要用到,则整个lib文件内容都放进exe文件中,这是在链接的时候将lib链接到了目标代码中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值