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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值