.lib.dll文件都是程序可直接引用的文件,前者就是所谓的库文件,后者是动态链接库(DynamicLinkLibrary)也是一个库文件。而.pdb则可以理解为符号表文件。DLL(DynamicLinkLibrary)文件为动态链接库文件,又称为“应用程序扩展”,是一种软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即dll文件,放置于系统中。
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。
静态链接库(StaticLinkLibrary)使用lib需注意两个文件:
动态链接库(DynamicLinkLibrary)的导入库(ImportLibrary)使用dll需注意三个文件:
这种lib是和dll配合使用的,里面没有代码,代码在dll中,这种lib是用在静态调用dll上的,所以起的作用也是链接作用,链接完成了,lib也没用了。至于动态调用dll的话,根本用不上lib文件。目标模块(exe或者dll)文件生成之后,就用不着lib文件了。
静态链接只需要lib文件,当然头文件也是需要的。这种方式时候lib文件中有两个部分,可以将文件后缀改为rar解压可以看到。第一部分就是和第一种方式中的key,第二部分是.obj文件存储在obj文件夹下,他相当与dll中的机器码,只不过这个机器码是在链接的时候放入程序的,而不是在程序运行时拿进来的。如果这时候我们也有源代码,并且希望IED可以调试源码,这很容易因为如果lib文件生成的时候模式是NDEBUG(好像不是也可以),obj文件夹下是有一个xx.pdb这个pdb文件中的东西会被IED放入程序的pdb中,所以直接指定源代码位置使用就可以了。1第一步:项目->属性->C/C++->常规->附加包含目录(浏览.h文件的路径)添加包含文件2第二步:项目->属性->C/C++->链接器->输入->附加依赖项(写入lib的名称)添加用到的lib(这一步也可以在代码中显示调用#pragmacomment(lib,“***.lib”))项目->属性->C/C++->链接器->常规->附加库目录添加库文件路径4第三步:在要使用cpp文件前加入#include
这种方式的基本原理是lib文件中包扩了某一段程序(函数)的入口或者说是地址,而他真正的机器码是在dll文件中,IDE链接的时候将.lib文件(程序地址)链接到源代码中,程序运行时到相应位置(环境变量path,当前目录等)寻找dll文件并执行其中的机器码。所以这种引用方式一般需要的文件一般有三个:.h,.lib,.dll,生成的源程序也会比较小,因为他只保存了函数地址,但是这种方式总是会出现找不到xxx.dll这种问题。如果这时候我们还有dll的源代码,并且希望IED可以调试源码,那么就需要.pdb文件了,pdb文件中保存了dll的符号表,所谓符号表可以理解为机器码(这里是dll中的)中插入的key与源代码文件的映射,这样只要指定源码存放的路径,IDE就会自动去找源码。需要注意的是,pdb文件和dll文件是配套的,也就是说一旦dll文件有改动(比如说重新生成)pdb文件就必须做相应改变。pdb文件也比较大,程序运行时也会因为要完成映射而比较慢,这也是release版与debug的区别。
对于dll文件的使用,将dll文件拷贝到工程debug文件下,或者在系统环境变量中加入dll文件的路径(...in)。
类似静态库的使用,直接在vs中进行配置。(其实本质还是隐式链接,只是配置方式不同)
第一种方法是:通过project->link->Object/LibraryModule中加入.lib文件(或者在源代码中加入指令#pragmacomment(lib,“Lib.lib”)),并将.dll文件置入工程所在目录,然后添加对应的.h头文件。
1#include
使用LoadLibrary显式链接,那么在函数的参数中可以指定DLL文件的完整路径;如果不指定路径,或者进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:(1)包含EXE文件的目录(2)工程目录(3)Windows系统目录(4)Windows目录(5)列在Path环境变量中的一系列目录