加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

动态库之---装载期间动态链接与运行期间动态链接

(2010-08-20 22:40:07)
标签:

动态库

动态链接

装载期间

运行期间

it

分类: IT

  这一周太忙了,没来打理博客:)

  今天工作上有了很大的进展,暗喜,成就感是程序员最大的乐趣http://www/uc/myshow/blog/misc/gif/E___6715ZHE1SIGG.gif

  下面讲讲动态库,动态库是程序员最常见的东西,所以我们一定要详细了解它,这是基本功:)

   动态库之---装载期间动态链接与运行期间动态链接

   重点:
   装载期间动态链接与运行期间动态链接只是调用动态库的方式,动态库本身不分装载期间动态链接库和运行期间动态链接库,为了使动态库可以被显式调用(运行期间动态链接),库的每个函数必须以extern "C" __declspec(dllexport)开始
1. 装载期间动态链接Load-time Dynamic Linking

  这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,
    编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;
    当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用
    程序的执行空间中,其主要目的是便于代码共享。

    编译的时候需要有头文件,LIB文件
    运行的时候需要动态库文件,如果缺少动态库文件,程序无法启动

    以下是装载期间动态链接库与静态库的区别
    动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或
    者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数
    和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。
    当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,
    这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷
    贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的
    描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行
    时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。
    当要执行所调用DLL中的函数时,根据链接产生的重定位信息,
    Windows才转去执行DLL中相应的函数代码。


2. 运行期间动态链接Run-time Dynamic Linking

  这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行
    过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress
    动态获得DLL函数的入口地址。

    编译的时候不需要头文件,LIB文件
    运行的时候可有可无动态库文件,如果缺少动态库文件,程序仍然能启动,
    只是没有动态库里所含的功能而已
   
    调用的时候需要用到以下API接口
    LoadLibrary
    GetProcAddress
    FreeLibrary

    缺点:函数名称必须保证编译后不变,只能使用C编译(extern "C"),这样就不能使用C++的重载

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有