一、静态库和动态库的区别
1. 静态库(.lib)
- 函数实现和变量的二进制文件
- 编译链接可执行程序时,静态库会直接展开到文件。
- 发布可执行程序时,不需要静态库。
- 编译出的可执行文件较大。
2. 动态库(.dll)
- windows下动态库一般包含引入库(.lib)文件和动态库(.dll文件)。
- dll包含函数实现和变量;lib包含该dll的中函数和变量的声明和位置,引入lib库后,就可以找到dll库。
- 编译链接时只需要lib,程序运行时才动态加载dll,将该dll映射到进程的地址空间中,然后访问dll中导出的函数。
- 发布时,需要携带lib和dll文件。
- 编译出的可执行文件较小。
二、动态库的使用
1. 隐式链接
需要.h,lib库,dll库。lib库只在编译用,dll库在运行时用
1.1 (方法一)在VS中配置
比较繁琐,建议方法二
1.1.1 .h库引用
工程属性—>VC++目录—>包含目录—>选择.h所在目录
1.1.2 lib库引用
(1)工程属性—>VC++目录—>库目录—>选择lib所在目录
(2)在链接时,也需要lib库
工程属性—>链接器—>输入—>附加依赖项
1.1.3 dll库引用
我一般就直接配置环境变量了,当然也可以在VS配置dll工作目录,方法如下
(1)工程属性—>VC++目录—>可执行文件目录—>选择可执行目录
(2)配置dll目录,工程属性—>VC++目录—>可执行文件目录—>选择可执行目录
Windows查找dll库的顺序:
- exe文件所在的目录下;
- 进程当前的工作目录;
- Windows系统目录;
- Windows目录;
- 环境变量Path下的一系列目录
1.2 (方法二)最简单的办法
(1)添加lib库,工程属性—>VC++目录—>库目录—>选择lib所在目录(或者直接在代码里写#pragma comment(lib, “Lib.lib”)
)
#include "stdafx.h"
#include "DLLSample.h"
#pragma comment(lib, "DLLSample.lib")
int main()
{
TestDLL(123); //dll中的函数,在DllSample.h中声明
return(1);
}
(2)添加.h头文件,工程属性—>VC++目录—>包含目录—>选择.h所在目录
(3)将dll库放入项目目录
2. 显示链接
如果只有dll库,则只能进行显示链接
- 使用Windows API的LoadLibrary函数,将DLL模块映像到进程的内存空间,对dll模块进行动态加载。
- 使用GetProcAddress函数得到要调用dll中的函数的指针。
- 不用dll时,使用FreeLibrary函数或从进程的地址空间显式卸载dll。
#include <iostream>
#include <windows.h> //使用函数和某些特殊变量
typedef void (*DLLFunc)(int);
int main()
{
DLLFunc dllFunc;
HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");//可以使用dll库的绝对路径,否则将会按照windows搜索方式进行搜索
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
if (dllFunc == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc(123);
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
三、静态库的使用
- 静态库lib文件是多个obj文件的集合,obj文件是cpp文件编译生成的
- lib文件包含了链接库的所有信息(函数代码和接口信息)
- 只需要.h文件和lib文件
1. 添加lib
方式与动态库相同文章来源:https://www.toymoban.com/news/detail-789147.html
2. 添加.h
方式与动态库相同
参考:基础:windows下lib和dll的区别和使用文章来源地址https://www.toymoban.com/news/detail-789147.html
到了这里,关于windows平台下静态库(.lib)和动态库(.dll)使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!