您的位置:首页 > 其它

链接库lib和dl的概念,加载方式的区别

2016-02-24 18:01 197 查看
使用LR进行基于windows socket协议做接口测试,只提供了lr_load_dll方法来动态加载动态链接库。之前学习阶段,对TinyXML的学习,使用的静态链接库,当时在程序调用的时候方法也跟LR里的不一样,那问题来了:lib和dll的区别是什么,每种链接库有多少种加载方式,怎么加载呢。

链接库可以向应用程序提供一些函数,变量和类。动态链接库的动态调用(也叫显式调用,手工加载)我是可以运用了,但是静态调用(也叫隐式调用,自动加载)。静态链接库:lib中的函数不仅被连接,全部实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的。动态链接库:dll不必被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名链接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时可以直接动态地引用和卸载DLL文件。同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。

如果编写的dll库,希望其他的应用程序,代码能调用里面的函数,需要设置该函数为DLL导出函数(或变量、类),这样才可供应用程序调用。例:extern "C" _declspec(dllexport) int Test(int a, int b);DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。导出函数还有一个格式:采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:LIBRARY 库工程名称 EXPORTS 导出函数名。

静态链接库lib,一般都是静态调用lib 用于静态调用和头文件*.h 结合使用。有三种方法:

  第一:lib文件直接加入到工程文件列表中
  在VC中选中工程名,单击鼠标右键,然后选中"Add --》Existing Item",在弹出的文件对话框中选中要加入的LIB文件。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可。把lib和.h文件都复制到工程下。(一般工程不采用此方法)

A. 选择添加



B.添加后变成这样



C.使用该函数的地方加上该LIB的头文件



D.复制头文件和lib到项目下



第二: 设置工程的 Project Settings来加载DLL的LIB文件
  打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件,如you.lib(或者lib文件的路径,包括文件名)。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可,把lib和.h文件都复制到工程下。(一般工程采用此方法)



  第三:通过程序代码的方式
  加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了)。
  当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。

动态链接库dll,一般分静态调用和动态调用。通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,应用程序时往往采用此方式。

第一:动态调用:

A. 源代码如下:



B. 运行后,在工程的debu目录下产生了dll文件。



C:复制到相关工程目录下,如下以在loadrunner中使用为例子。



第二:静态调用。(lib+.H+DLL)

1.把DLL,lib,.H拷到你目标工程的Debug目录下;

2.打开你的目标工程选中工程,选择属性菜单,在对话框的多页显示控件中选择Link页。然后在Object/library中选择好lib;

3.目标工程Head Files加入:.h文件; 目标工程(*.cpp,需要调用DLL中的函数)中包含:#include ".h "

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: