特别篇之动态链接库,静态链接库

来源:互联网 发布:苏联加入轴心国 知乎 编辑:程序博客网 时间:2024/04/29 07:30

dll(dynamic linking library)

msdn上说:

dll是一个包含函数和数据的模块,被其它模块调用,包括应用程序或其他dll

在一个dll可以定义导出和内置这两种函数,导出函数可以被外部和内部调用,内置函数则在内部调用。尽管dll可以导出数据,但通常用于它的函数中。但也不阻止数据被导出(比如说资源库)。

dll提供了一种方法使应用程序模块化以便于它的功能更新和重用,dll也减少了内存开销当多个程序同时使用同一功能时,因为每个程序使用的是同一dll的副本,共享同一段dll代码.


顾名思义dll是动态链接时需要的库函数。那么什么是动态链接呢?

动态链接就是把调用的函数所在文件模块(DLL)的信息和调用函数在DLL中的位置等信息(.lib)在链接时链接到.exe文件中,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  lib,dll是已经编译好的二进制代码.



什么时候使用动态链接库呢,程序中又怎么调用呢?

一般来说,只有用于大型程序中才最有意义,封装公用代码和资源,一来缩小体积,二来灵活高效。而在小程序中直接静态链接进去反而效率更高,同时也便于传播。

隐式调用:

1)       在主程序包含DLL中导出的头文件。

2)       采用#pragma comment(lib,"..//debug//libTest.lib")导入动态库生成的*.lib头文件。或在projectàsettingsàLinkeràInputAdditional Dependencies中加入lib文件。

3)       将动态库生成的*.dll文件放到EXEDLL的同一目录下。

显式调用:


// A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll.  #include <windows.h> #include <stdio.h>  typedef int (__cdecl *MYPROC)(LPWSTR);  int main( void ) {     HINSTANCE hinstLib;     MYPROC ProcAdd;     BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;      // Get a handle to the DLL module.    hinstLib = LoadLibrary(TEXT("MyPuts.dll"));      // If the handle is valid, try to get the function address.     if (hinstLib != NULL)     {         ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");         // If the function address is valid, call the function.         if (NULL != ProcAdd)         {            fRunTimeLinkSuccess = TRUE;            (ProcAdd) (L"Message sent to the DLL function\n");        }        // Free the DLL module.        fFreeResult = FreeLibrary(hinstLib);    }     // If unable to call the DLL function, use an alternative.    if (! fRunTimeLinkSuccess)         printf("Message printed from executable\n");     return 0;}



静态链接(static linking)

一般是在程序开发过程中发生的,用于把一些文件链接在一起创建一个windows可执行文件。这些文件包括各种各样的对象模块(.obj),运行时库文件(.lib),通常还有已编译的资源文件(.res)。

这里所指的对象模块(.obj)是指已编译后的源程序,运行时库文件(lib)是指一些静态链接库。已编译的资源文件(.res)是指编译成二进制码的资源文件,也有些资源是不用编译。静态链接库包含声明与实现,在程序链接的时候嵌入到宿主程序中包含在最终形成exe文件里。


使用方法:


//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数
#endif

//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}


#include <stdio.h>
#include "../lib.h"//不可丢失
#pragma comment( lib, "..//debug//libTest.lib" )  //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}


请注意静态链接并非链接该类库中的所有内容,从生成的exe文件大小和程序分析可知,链接器只从静态类库中提取与宿主程序调用相关的代码,重复调用时也会重复生成。

区别于动态链接,如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。这样才达到了节省空间的目的。同时,如果更新的话,要是仅仅是函数内容变化的话,也只有重新编译dll,而不是整个工程





0 0
原创粉丝点击