一、库的基本概念
库是已经写好的、成熟的、可复用的代码。每个程序都需要依赖很多底层库,不可能每个人的代码从零开始编写代码,因此库的存在具有非常重要的意义。在我们的开发的应用中经常有一些公共代码是需要反复使用的,就把这些代码编译为库文件。
库可以简单看成一组目标文件的集合,将这些目标文件经过压缩打包之后形成的一个文件。像在Windows这样的平台上,最常用的C语言库是由集成按开发环境所附带的运行库,这些库一般由编译厂商提供。
二、静态库与动态库简介
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
三、静态库的创建与使用
1、静态库的创建
1)创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入staticlib(不能是中文)。点击确定。
2) 在解决方案资源管理器的头文件中添加 mylib.h文件,在源文件添加mylib.c文件(即实现文件)。
// mylib.h文件中添加如下代码:
#ifndef MYLIB_H
#define TMYLIB_H
int myadd(int a, int b);
#endif
// mylib.c文件中添加如下代码:
#include "mylib.h"
int myadd(int a, int b)
{
return a + b;
}
3)配置项目属性。因为这是一个静态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“静态库(.lib)。
4)编译生成新的解决方案,在Debug文件夹下会得到staticlib.lib (对象文件库),将该 .lib文件和相应头文件给用户,用户就可以使用该库里的函数了。
2、静态库的使用
将mylib.h和staticlib.lib复制到源代码目录下:
通过编译语句使用静态:
#pragma comment(lib,"./staticlib.lib")
3、 静态库优缺点
1)静态库对函数库的链接是放在编译时期完成的,静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;
2)程序在运行时与函数库再无瓜葛,移植方便;
)浪费空间和资源,所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
四、动态库创建和使用
1、动态库的介绍
要解决空间浪费和更新困难这两个问题,最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不是将他们静态的链接在一起。简单地讲,就是不对哪些组成程序的目标程序进行链接,等程序运行的时候才进行链接。也就是说,把整个链接过程推迟到了运行时再进行,这就是动态链接的基本思想。
2、动态库的创建
1)创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入mydll(不能是中文)。点击确定。
2)在解决方案资源管理器的头文件中添加myadd.h文件,在源文件添加myadd.c文件(即实现文件)。
// myadd.h文件中添加如下代码:
#ifndef MYADD_H
#define MYADD_H
__declspec(dllexport) int myadd(int a, int b);
#endif
// myadd.c文件中添加如下代码:
#include "myadd.h"
__declspec(dllexport) int myadd(int a, int b)
{
return a + b;
}
3)配置项目属性。因为这是一个动态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“动态库(.dll)。
4)编译生成解决方案,在Debug文件夹下会得到mydll.dll (对象文件库),将该.dll文件、.lib文件和相应头文件给用户,用户就可以使用该库里的函数了。
3、相关说明
-
__declspec(dllexport)
动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。 -
动态库的lib文件和静态库的lib文件的区别
在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。
4、动态库的使用
一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
1)将myadd.h、mydll.lib复制到源代码目录下:
2)编译生成解决方案,但不运行程序:
3)mydll.dll 是拷贝到可执行程序所在目录,运行程序: