当前位置:C++技术网 > 资讯 > lib库知识全面讲解:4 lib导入库有什么用,怎么生成lib导入库和dll?

lib库知识全面讲解:4 lib导入库有什么用,怎么生成lib导入库和dll?

更新时间:2015-10-25 00:05:29浏览次数:1+次

    通过前面三篇的介绍,静态lib库,就完全讲清楚了。那么这里我们来介绍一下lib导入库。虽然lib导入库不是很重要,但是为了方便使用dll,lib导入库还是很常用。但是没有lib导入库,也是可以使用dll的。所以说,lib导入库是一个附加的增值产品。
    dll是用来动态链接的,也就是程序运行时才链接的。静态链接就是在生成exe时就链接到exe里了。链接最终的目的是要将dll载入到和exe同一个进程空间中。尽管这里是动态链接,它只是在链接的时间上延迟罢了。静态链接时,直接在生成时将库的内容放在了exe中,当exe文件加载到内存时,链接的库的内容也加载到内存了。动态链接库dll则是在生成exe的时候只用了一个占位表,叫做重定位表。然后在exe需要的时候,再将dll加载到exe所在的进程的内存空间中。
    所以说,不管是静态链接还是动态链接,最终都是要到exe的进程内存空间中的,是跑不了的。躲得了初一躲不了十五,dll只是延迟加载到内存罢了。
    我们要使用dll,为了方便知道dll中的所有函数都在什么位置,就用上了lib导入库。这个导入库记录了dll中的所有函数在dll中的位置,那么我们引入了lib导入库之后,在运行的时候,在加载了dll后,就可以方便的定位需要的函数了。有了这个lib导入库,我们不需要手动的去找dll中的函数了。使用dll就和静态lib库或者和直接的源码中写的函数一样简单。
    另一种就不用lib导入库了,使用API函数LoadLibrary来加载dll到内存中,然后使用API函数GetProcAddress来找到dll中的函数地址。这里的使用,将在dll的专题中讲解,就不多述了。
    那么我们知道了lib导入库的作用,现在来生成dll和lib导入库。这里和上一篇《lib库知识全面讲解3:如何使用静态lib库?如何静态链接开源库第三方库?》,在生成dll的代码中,不要写main函数哦。
    生成dll很简单,和《lib库知识全面讲解2:lib静态库是如何生成的?怎么生成自己的lib静态库?》一样的,只是在选择生成类型时,选择dll即可。然后生成的就是dll了。
    但是直接生成dll后,发现并没有生成lib导入库。要生成lib导入库,我们需要使用模块定义文件(.def)。
    我们新建一个def文件。在“解决方案资源管理器”的项目名称上右击,添加新项,选择“Visual C++”下的“代码”,然后选择“模块定义文件(.def)”,添加文件即可。如下图所致:

  lib库知识全面讲解4:lib导入库有什么用以及怎么生成lib导入库?如何生成dll?
    添加后,def文件只有LIBRARY几个字。这几个字,可以要也可以不要。你想要就留着,不想要就删了,不要的话,后面也不要写什么dll名称了,会自动将DLL文件和def关联起来的。如果要的话,后面用一个空格隔开,然后填写好你生成的DLL的文件名称,大小写无所谓。只要是dll文件名的几个字符就行。
    这样,然后在接下来的写关键字EXPORTS,换行写要导出的函数名和指定函数的序号,一行一个。如果要写序号的话,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。
    我们看看头文件myDll里面定义的函数代码:

#include <stdio.h>
void show();
void showme();

     我们看看源文件的函数实现代码:

#include "myDll.h"
void show()
{
    printf("hello myDll");
}
void showme()
{
    printf("Hi");
}

     这里有两个函数,你在def的EXPORTS后面可以导出多个函数名称,这样就可以直接在引用lib导入库后,就可以使用def中导出的函数了。所以,如果你在def只导出部分函数,那么未导出的函数无法通过引入导入库的方式使用。为了方便,我们把两个函数都导出函数名称,那么def内容如下:

EXPORTS
show @1
showme @2

     后面的@需要和函数名用空格隔开,@和后面的序号隔不隔开并不没有问题。那么这些完成后,重新生成解决方案,这样就可以了。然后在项目文件夹中可以看到dll和lib导入库文件都出现了。如下图所示:

   

    那么到此,我们就讲解完了。后面如何使用导入lib和dll,则在dll专题中讲解了。
    注意,dll要给别人使用,记得同时带上头文件哦。lib导入库也给人家,这样人家可以方便的使用哦。