也叫做静态链接库和动态链接库。
库:写好功能的函数。都是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
- 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
- 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;
- }