一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:
动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。
关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
编译生成LIB
1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------ 1> test.cpp 1> test.vcxproj -> D:visual studio estDebug est.lib ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
编译生成DLL:
#ifndef __ADD_H__ #define __ADD_H__ extern "C" int _declspec(dllexport) add(int x, int y); #endif
#include "add.h" int add(int a, int b) { return a + b; }
1> add.vcxproj -> D:visual studioaddDebugadd.dll
#include <iostream> #include <windows.h> using namespace std; typedef int(*FUN)(int, int);//定义指向和DLL中相同的函数原型指针 int main() { int x, y; HMODULE hDLL = LoadLibrary("D:\visual studio\add\Debug\add.dll");//加载dll if (hDLL != NULL) { FUN add = FUN(GetProcAddress(hDLL, "add"));//获取导入到应用程序中的函数指针,根据方法名取得 if (add != NULL) { cout << "Input 2 Numbers:"; cin >> x >> y; cout << add(x, y) <<endl; } else { cout << "Cannot Find Function" << endl; } FreeLibrary(hDLL); } else { cout << "Cannot Find dll" << endl; } return 1; }
Input 2 Numbers:3 4 7 请按任意键继续. . .
静态调用(同时需要头文件、LIB和DLL文件,缺一不可)
#ifndef __USEDll_H__ #define __USEDll_H__ extern "C" _declspec(dllimport) int add(int x, int y); #endif
#include "UseDll.h" #include <iostream> using namespace std; #pragma comment(lib,"D:\visual studio\UseDll\Debug\add.lib") int main() { int x, y; cout << "Input 2 Numbers:"; cin >> x >> y; cout << add(x, y) <<endl; }
Input 2 Numbers:10 10 20 请按任意键继续. . .