也叫做静态链接库和动态链接库。
库:写好功能的函数。都是exe文件。
程序安装完之后,会出现.dll和.lib文件。
程序运行中,可能需要调用的库。
将一个程序编译成可执行程序的步骤:预处理、编译、汇编、链接、可执行文件
库是写好的,例如cout、createthread等库函数。仅调用即可。
理解:库就是可执行的二进制文件。
静态库:.a/.lib
动态库:.so/.dll
分别是Linux和windows下的后缀。
区别
区别在于,在链接阶段,如何处理链接成可执行程序。
静态库:
- 编译时期完成的链接
- 程序运行过程中,与库无关系,移植方便(优点)
- 浪费空间和资源,更新复杂(缺点)
动态库每次执行都要链接
静态库只链接一次,嵌入exe中,将目标文件压缩到一起,对其编号和索引进程
先生成exe,而后是lib。无数个.o合体成为新的。o就是汇编文件。
静态链接库
把所有的.o文件合成lib
若静态库更新,则需重新生成一个exe,更新复杂。
静态库特点:
1、空间浪费
2、更新复杂,需要重新下载
静态库对程序的更新、部署和发布页会带来麻烦
如果今天静态库更新了,所有使用它的应用程序都需要重新编译,再发给用户。
为了解决此缺点,提出了动态库
动态链接库
仅此一份,程序执行时才会链接这个库,动态库更新,仅更新dll即可放回之前的位置。
静态库步骤
//静态库头文件mylib.h
#pragma once
#include<iostream>
using namespace std;
int add(int a, int b);
int sub(int a, int b);
//静态库cpp文件mylib.cpp
#include"mylib.h"
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
将mylib.h和上一级Debug里的mylib.lib文件提取出来,放入新的lib目录中,与主函数cpp文件同目录下。
//主函数
#include"./lib/mylib.h"
#pragma comment(lib,"./lib/mylib.lib")
int main() {
cout << add(2, 3) << endl;
cout << sub(6, 5) << endl;
system("pause");
return 0;
}
动态库步骤
//动态库头文件mydll.h
#pragma once
#include<iostream>
using namespace std;
_declspec(dllexport) int mlt(int a, int b);
//动态库cpp文件mydll.cpp
#include"mydll.h"
int mlt(int a, int b) {
return a * b;
}
将mydll.h和Debug下的lib和dll文件拿走,h和lib放入cpp目录中的dll目录,而dll必须放入exe相同的目录下。
#include"./dll/mydll.h"
#pragma comment(lib,"./dll/mydll.lib")
int main() {
cout << mlt(3, 5) << endl;
system("pause");
return 0;
}