Windows 下动态链接库和静态链接库

时间:2024-06-08 22:06:44

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 ;
}