1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快。
缺点在于一套代码可能在内存中有多份拷贝,占用内存。
2.动态链接库:库由windos api加载库代码,内存中只有一份拷贝。工程中只保留链接到这份代码的引用,有两种动态链接库,
(a)load time dynamic linking:工程运行的时候自动加载,结束时自动卸载
(b) run time dynamic linking: 在工程运行过程中通过调用LoadLibrary()和GetProcAddress()函数加载库函数,用FreeLibrary()函数卸载
下面是实例:
1. 静态库:
通过vs创建win32的静态库,工程名为libTest,加入lib.h, lib.cpp
#ifndef LIB_H
#define LIB_H extern "C" int add(int x, int y); #endif
#include "lib.h" int add(int x, int y)
{
return x+y;
}
代码简单,不解释。编译后生成libTest.lib文件。
我们需要把.lib文件和lib.h文件拷贝到引用的工程中(或者可以把.lib文件通过配置link指定)
新建工程进行引用:
#include "lib.h"
#pragma comment(lib, "testLib.lib"); int _tmain(int argc, _TCHAR* argv[])
{
printf("2+3= %d", add(, ));
while() ;
return ;
}
关键是
#pragma comment(lib, "testLib.lib");指令
2.动态库:
新建项目win32的dll,名字dllTest,加入3个文件,lib.cpp, lib.h, lib.def,代码如下:
//dll.h
#ifndef LIB_H
#define LIB_H extern "C" int __declspec(dllexport) add(int x, int y); #endif //===================dll.cpp=======================
#include "lib.h" int add(int x, int y)
{
return x+y;
} //---------------------------------dll.def-----------------------------------
LIBRARY dllTest2
EXPORTS
add @
.def文件表明了要导出哪些函数,导出的库名字。@后面是函数编号,前面是函数名字。
编译后生成dllTest.lib, dllTest.dll,其中.lib文件用于load time dynamic linking,只是和静态库一样的调用方式,提供一个到dll的引用
(1)run time dynamic linking(只要dll文件):
#include <Windows.h>
#include <stdio.h> typedef int (*lpAddfun)(int, int);
//定义一个函数指针 int main()
{
HINSTANCE hDll; //dll的句柄
lpAddfun addFun; //函数指针变量 hDll = LoadLibrary(TEXT("dllTest2.dll"));
if(hDll != NULL)
{
addFun = (lpAddfun)GetProcAddress(hDll, "add");
if(addFun != NULL)
{
int result = addFun(, );
printf("%d", result);
}
FreeLibrary(hDll);
}
while();
return ;
}
(2)load time dynamic linking(既要.lib又要.dll)
#pragma comment(lib,"dllTest.lib") extern "C" __declspec(dllimport) add(int x,int y); int main(int argc, char* argv[])
{
int result = add(,);
printf("%d",result);
return ;
}