计网 静态库和动态库
一.我们先来了解一下一个程序编译成可执行文件的四个过程
1.预处理期(预编译)
在预处理期会进行替换,将头文件和宏定义进行替换
2.编译期
编译期会将源代码变为汇编语言
3.汇编期
汇编期是把汇编语言变为机器语言 .obj文件/.o文件(windows下是 .obj文件linux是.o文件)
4.连接期
连接期是把所有的.obj文件/.o文件和程序中引用的动态库和静态库连接到一起生成可执行文件
二.动态库和静态库
1.所谓的动态和静态说的是库连接的方式
2.静态库的文件有两种
(1) .a文件
(2).lib文件
3.动态库的文件有两种
(1).so文件(linus中.so文件用的比较多)
(2).dll文件(windows中用的是.dll文件)
4.静态库和动态库的使用
1.静态库的使用
直接拷贝到可执行文件中
2.动态库的使用
动态库在使用的过程中还需要有一个索引(同名字,但不同文件类型,索引文件是.lib文件)
把索引拷贝到可执行文件中
5.静态库和动态库的优缺点
1.静态库
1.静态库会造成空间浪费
2.静态库对程序的更新、部署和发布页会带来麻烦。如果静态库更新了,那么所有使用它的应用程序都需要重新编译、发布给用户
三.自己创建一个静态库,并在其他程序中进行使用
1.创建静态库文件
1.创建一个静态库项目
2.在静态库中写一个加法函数
1.加法函数的声明(写在pch.h文件中)
代码如下
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
int add(int a, int b);
#endif //PCH_H
2.加法函数的定义(写在pch.cpp文件中)
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
int add(int a, int b) {
return a + b;
}
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
3.生成解决方案(生成解决方案时会生成库),通过绝对路径获得静态库
1.生成解决方案
2.通过绝对路径获得静态库
这里说一下绝对路径和相对路径的知识点
1.绝对路径:在windows里面,从盘符开始的路径就是绝对路径
例如:F:\vs\jingtaiku\x64\Debug\jingtaiku.lib
2.相对路径:从任意位置开始,./(表示当前路径)或者…/(表示上一层路径)
2.再创建一个新项目用来使用静态库
1.创建一个新项目
2.使用静态库
使用静态库的步骤
1.包含头文件(如果使用一个函数出现未定义标识符的错误就说明是没有包含头文件)
将pch.h这个头文件放到当前项目所在的文件夹,如下
先在当前文件夹中创建一个用来放头文件的文件夹
再将pch.h这个头文件放到此文件夹中
然后还要将framework.h这个头文件放入到此文件夹中,因为在pch.h头文件中用到了framework.h这个头文件
最后进行包含头文件代码的书写,整体代码如下
#include<iostream>
#include"./tou/pch.h"//包含头文件
using namespace std;
int main() {
int c = add(2, 4);
cout << "2 + 4 = "<<c << endl;
return 0;
}
2.导入依赖库(如果出现无法解析的外部符号就说明编译器能找到函数的声明但找不到函数的是实现,缺少库文件的引用)
先在当前文件夹中创建一个存放库的文件夹再把静态库放到此文件夹中
(1)创建一个存放库的文件夹
(2)把静态库放到此文件夹中
然后进行导入依赖库代码的书写,整体代码如下
#include<iostream>
#include"./tou/pch.h"//包含头文件
using namespace std;
#pragma comment(lib/*第一个变量是固定的lib*/,"./ku/jingtaiku.lib"/*第二个变量是引用的那个库的路径(这是个相对路径相对于当前文件夹的路径)*/)//导入依赖库
int main() {
int c = add(2, 4);
cout << "2 + 4 = "<<c << endl;
return 0;
}
四.自己创建一个动态库,并在其他程序中进行使用
1.创建动态库文件
1.创建一个静态库项目
2.在动态库中写两个函数(一个是加法函数,一个是减法函数)
1.加法函数的声明(写在pch.h文件中)
代码如下
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
//添加导出(添加导出之后才能在索引里找到这个函数的实现)
_declspec(dllexport) int add(int a, int b);
//没添加导出的话就找不到这个函数的实现
int sub(int a, int b);
#endif //PCH_H
2.加法函数的定义(写在pch.cpp文件中)
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
3.生成解决方案(生成解决方案时会生成库和索引),通过绝对路径获得动态库和其索引
1.生成解决方案
2.通过绝对路径获得动态库和其索引
2.再创建一个新项目用来使用动态库
1.创建一个新项目
2.使用动态库
使用动态库的步骤
1.包含头文件(如果使用一个函数出现未定义标识符的错误就说明是没有包含头文件)
将pch.h这个头文件放到当前项目所在的文件夹,如下
先在当前文件夹中创建一个用来放头文件的文件夹
再将pch.h这个头文件放到此文件夹中
然后还要将framework.h这个头文件放入到此文件夹中,因为在pch.h头文件中用到了framework.h这个头文件
2.导入依赖库(此时导入的是索引文件)(如果出现无法解析的外部符号就说明编译器能找到函数的声明但找不到函数的是实现,缺少库文件的引用)
先在当前文件夹中创建一个存放库(此时存放的是索引文件)的文件夹再把动态库的索引放到此文件夹中
(1)创建一个存放库的文件夹(此时存放的是索引文件)
(2)把动态库的索引放到此文件夹中
然后进行导入依赖库代码的书写,整体代码如下
#include<iostream>
#include"dlltou/pch.h"
using namespace std;
#pragma comment(lib,"./dllku/dongtai_Dll1.lib")
int main() {
int c = add(2, 4);
cout << "2 + 4 = "<<c << endl;
return 0;
}