静态数据连接库(.lib)和动态连接库(.dll)
相关资料:https://baike.baidu.com/item/lib%E6%96%87%E4%BB%B6/2108657?fr=aladdin
意义
LIB文件中存放的是函数调用的信息,值得一提的是数据库有静态数据库(.lib文件)和动态数据库(.dll文件)。
静态编译
静态编译将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
静态编译的优点是编写出来的程序不需要调用DLL和载入函数,直接可以当成程序的一部分来使用。
静态编译的缺点也是显而易见的,使用静态编译的程序体积会比动态编译大,原因是函数的实现被嵌入为程序代码的一部分
生成静态连接库:生成控制台项目-应用程序类型选择静态库,并把预编译头勾选去掉-随后即可像平时一样定义头文件和源文件。
此时应该在头文件处声明变量、函数,然后在源文件中定义其内容;
注意:定义头文件时,应该声明(此处以头文件名为“myLib.h”做例子)#ifndef _MYLIB_H #define _MYLIB_H //文件内容 xxxxx; #endif 来防止该预编译头被多次应用
随后生成出来xxx.lib(静态链接库)和xxx.h文件
使用时,应将.lib和.h文件拖到项目目录下,在要引用该静态库的源文件上,用#pragma comment (类型(lib),名字("xxx.lib"))来引用该静态库(或是引用项目-属性-链接器-输入-附加依赖项-输入要引用的静态库文件(“名字.lib”)),然后#include"xxx.h"来引用头文件
故:给别人发静态连接库的时候要发.lib和.h文件(.h文件注意声明时的格式)
当你想调试时,先创建一个lib文件,在其.h文件声明,.cpp定义,随后生成,得到lib文件
然后在同一个项目下,添加一个控制台程序,将.h加载进来,然后右键控制台程序-添加-引用-将刚才生成的.lib文件引用进来就可以使用了。
动态编译
动态LIB文件相当于一个C语言中的h文件,是函数导出部分的声明,而不将实现过程嵌入到程序本身中,编译后只是将函数地址存在宿主程序中,运行到调用函数是调用DLL并载入函数来实现函数的具体操作。
与dll区别
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。
加载方法
直接加入
在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
设置
打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
程序代码
加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。
当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。
总结:与dll一起生成的时候产生的lib 起到指引作用,指引程序在调用指定函数的时候,该去哪里调用。lib=对应dll的地址说明书,dll则放着实物,程序通过dll指明的地址去拿到里面的实物
相关资料:https://baike.baidu.com/item/lib%E6%96%87%E4%BB%B6/2108657?fr=aladdin
意义
LIB文件中存放的是函数调用的信息,值得一提的是数据库有静态数据库(.lib文件)和动态数据库(.dll文件)。
静态编译
静态编译将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
静态编译的优点是编写出来的程序不需要调用DLL和载入函数,直接可以当成程序的一部分来使用。
静态编译的缺点也是显而易见的,使用静态编译的程序体积会比动态编译大,原因是函数的实现被嵌入为程序代码的一部分
生成静态连接库:生成控制台项目-应用程序类型选择静态库,并把预编译头勾选去掉-随后即可像平时一样定义头文件和源文件。
此时应该在头文件处声明变量、函数,然后在源文件中定义其内容;
注意:定义头文件时,应该声明(此处以头文件名为“myLib.h”做例子)#ifndef _MYLIB_H #define _MYLIB_H //文件内容 xxxxx; #endif 来防止该预编译头被多次应用
随后生成出来xxx.lib(静态链接库)和xxx.h文件
使用时,应将.lib和.h文件拖到项目目录下,在要引用该静态库的源文件上,用#pragma comment (类型(lib),名字("xxx.lib"))来引用该静态库(或是引用项目-属性-链接器-输入-附加依赖项-输入要引用的静态库文件(“名字.lib”)),然后#include"xxx.h"来引用头文件
故:给别人发静态连接库的时候要发.lib和.h文件(.h文件注意声明时的格式)
当你想调试时,先创建一个lib文件,在其.h文件声明,.cpp定义,随后生成,得到lib文件
然后在同一个项目下,添加一个控制台程序,将.h加载进来,然后右键控制台程序-添加-引用-将刚才生成的.lib文件引用进来就可以使用了。
动态编译
动态LIB文件相当于一个C语言中的h文件,是函数导出部分的声明,而不将实现过程嵌入到程序本身中,编译后只是将函数地址存在宿主程序中,运行到调用函数是调用DLL并载入函数来实现函数的具体操作。
与dll区别
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。
加载方法
直接加入
在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
设置
打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
程序代码
加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。
当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。
总结:与dll一起生成的时候产生的lib 起到指引作用,指引程序在调用指定函数的时候,该去哪里调用。lib=对应dll的地址说明书,dll则放着实物,程序通过dll指明的地址去拿到里面的实物