库档案

库档案

库档案即DLL(Dynamic Link Library)档案,是动态程式库档案,又称“应用程式拓展”,是软体档案类型。在Windows中,许多应用程式并不是一个完整的执行档,它们被分割成一些相对独立的动态程式库,即DLL档案,放置于系统中。当我们执行某一个程式时,相应的DLL档案就会被调用。一个应用程式可使用多个DLL档案,一个DLL档案也可能被不同的应用程式使用,这样的DLL档案被称为共享DLL档案。

    • 中文名:库档案
    • 外文名:Dynamic Linkable Library
    • 别称:DLL档案
    • 採用:动态程式库
    • 方式:共享代码

介绍

先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变数、函式或类。在仓库的发展史上经历了“无库-静态程式库-动态连结库”的时代。静态程式库与动态程式库都是共享代码的方式,如果採用静态程式库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE档案中了。但是若使用DLL,该DLL不必被包含在最终EXE档案中,EXE档案执行时可以“动态”地引用和卸载这个与EXE独立的DLL档案。静态程式库和动态程式库的另外一个区别在于静态程式库中不能再包含其他的动态程式库或者静态库,而在动态程式库中还可以再包含其他的动态或静态程式库。

对动态程式库,我们还需建立如下概念:

(1)DLL 的编制与具体的程式语言及编译器无关

只要遵循约定的DLL接口规範和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。

(2)动态程式库随处可见

我们在Windows目录下的system32资料夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函式主要处理记忆体管理和进程调度;user32.dll中的函式主要控制用户界面;gdi32.dll中的函式则负责图形方面的操作。

一般的程式设计师都用过类似MessageBox的函式,其实它就包含在user32.dll这个动态程式库中。由此可见DLL对我们来说其实并不陌生。

(3)VC动态程式库的分类

Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不採用MFC类库结构,其导出函式为标準的C接口,能被非MFC或MFC编写的应用程式所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无讯息循环;MFC扩展DLL採用MFC的动态连结版本创建,它只能被用MFC类库所编写的应用程式所调用。

2.静态程式库

对静态程式库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态程式库的例子可以快速地帮助我们建立“库”的概念。

如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程),并新建lib.h和lib.cpp两个档案,lib.h和lib.cpp的原始码如下:

用visual studio 创建动态库

//档案:lib.h

#ifndef LIB_H

#define LIB_H

int add(int x,int y); //声明为C编译、连线方式的外部函式

#endif

//档案:lib.cpp

#include stdafx.h

#include lib.h

int add(int x,int y)

{

return x + y;

}

编译这个工程就得到了一个.lib档案,这个档案就是一个函式馆,它提供了add的功能。将头档案和.lib档案提交给用户后,用户就可以直接使用其中的add函式了。

标準Turbo C2.0中的C库函式(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp档案,它演示了静态程式库的调用方法,其原始码如下:

#include

#include ..\lib.h

#pragmacomment( lib, ..\\debug\\libTest.lib )  //指定与静态库一起连线

int main(int argc, char* argv[])

{

printf( 2 + 3 = %d, add( 2, 3 ) );

}

静态程式库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , ..\\debug\\libTest.lib )的意思是指本档案生成的.obj档案应与libTest.lib一起连线。如果不用#pragma comment指定,则可以直接在VC++中设定,如图2,依次选择tools、options、directories、library files选单或选项,填入库档案路径。图2中加红圈的部分为我们添加的libTest.lib档案的路径。

这个静态程式库的例子至少让我们明白了库函式是怎么回事,它们是哪来的。我们现在有下列模糊认识了:

在VC中设定库档案路径

(1)库不是个怪物,编写库的程式和编写一般的程式区别不大,只是库不能单独执行;

(2)库提供一些可以给别的程式调用的东东,别的程式要调用它必须以某种方式指明它要调用之。

以上从静态程式库分析而得到的对库的懵懂概念可以直接引申到动态程式库中,动态程式库与静态程式库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。

相关信息

在PROTEL中建立工程就是要利用库档案的,它们是工程的主要内容。有原理图符号库(SCH),电路板图封装库(PCB),原理图仿真库(SIM),PLD设计库四大库档案。

相关词条

相关搜索

其它词条