【计算机网络】 静态库与动态库

文章目录

库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。静态库是将整个库文件都拷贝到可执行文件中了,而动态库只是将索引文件拷贝到可执行文件中,可以通过索引文件找到动态库文件。

静态库实践

使用方法

首先我们用vs创建一个静态库,再创建之后我们发现会自动生成4个文件(两个头文件,两个源文件)

先来看pch.h文件

一进去会给出一些注释

其实意思就是在这个文件中加载头文件和声明函数的

然后framework.h中是定义宏的

pch.cpp里就是对pch.h中声明的函数进行定义

最后那个自己命名的文件就是测试文件

比如我们想创建一个加法函数,那么首先我们在pch.h中声明这个函数

然后在pch.cpp中进行实现

因为库不能执行,所以不能点击本地调试器,我们可以点击生成中的生成解决方案,这样就不会报错了

点击后我们就可以看到生成了一个.lib文件,也会显示出它的路径

可以在这条路径中找到静态库文件

那么我们要怎么使用这个静态库呢?

我们需要再打开一个解决方案,创建一个空项目,然后添加一个源文件,我们想在这个源文件中使用刚才在静态库中添加的函数

在没做任何操作的时候会出现一个未定义标识符的错误,因为不认识这个函数(当前项目里没有这个函数),解决办法就是添加头文件,那么头文件在哪呢,在我们刚才那个项目的路径中可以找到那个pch.h,然后在pch.h中还调用了framework.h

所以将这两个个文件拷贝到当前项目中,然后添加头文件

此时我们可以看到不再报错,但是如果要运行还是不可以,会出现"无法解析的外部符号"的错误,因为这个函数目前只有声明,并没有定义实现,解决办法是添加库依赖

先将刚才生成的库拷贝到当前路径下

这里为了使项目看起来更清晰整洁,我们可以创建两个文件夹,一个用来放头文件,一个用来放库文件

那么这样我们在添加的时候就需要稍微寻找一下路径,这里涉及到绝对路径和相对路径:

  • 相对路径:./(当前路径下)或者是.../(当前文件夹向上一层)
  • 绝对路径:从盘符开始的路径,比如:E:\20230105\静态库与动态链接库\network_1_01_applyLib

使用:只有当前项目使用的文件,要随着项目的移动一起移动,放到同一个解决方案里,使用相对路径;

操作系统提供的文件,使用绝对路径。

添加库依赖:

最后再加上system("pause");,这样就可以运行了

总结

使用步骤:

  1. 把头文件拷贝到当前项目中,添加头文件依赖
  2. 把库文件拷贝到当前项目中,添加库文件依赖

动态库实践

使用方法

先创建一个动态链接库文件,与静态库一样,这里也有四个文件

我们在这个文件中写两个函数(为了比较),一个加法函数,一个减法函数

我们在声明减法函数的前面写上_declspec(dllexport),因为只有声明导出,才会在索引文件中生成索引

实现这两个函数

然后我们旋转生成解决方案,可以看到,生成了一个.lib索引文件和一个.dll

我们去对应路径下找到他们,然后拷贝到静态库实践中我们创建的那个测试项目中,当然那两个头文件也需要拷贝过来

如果是静态库,到此为止已经可以正常执行了,但我们在运行的时候发现会出现找不到dll文件的错误,原因是我们需要将dll拷贝到exe同文件下

这样就可以了

我们知道静态库有一个优点,就是在库文件更新时,只需要重新编译库并把库提供给别人,别人不需要重新执行可执行文件就可以执行exe

我们在刚才动态库中的代码修改一下,然后重新生成一下

再将用户的exe同文件下的dll替换就可以,我们点击exe可以发现执行结果已经做出改变

总结

使用步骤:

  1. 把头文件拷贝到当前项目中,添加头文件依赖
  2. 把索引文件拷贝到当前项目中,添加索引文件依赖
  3. 把dll拷贝到exe同文件下

静态库与动态库的优缺点

静态库

优点

运行速度比动态库快

缺点
  1. 浪费内存空间,当多个应用程序依赖同一个静态库,在内存中要拷贝多份
  2. 更新部署发布比较麻烦,修改静态库代码,不止要重新编译库文件,还需要重新编译整个可执行文件

动态库

缺点

运行速度比静态库慢

优点
  1. 节省内存空间,当多个应用程序依赖同一个动态库,在内存中只需要拷贝一份
  2. 更新部署发布简单,修改动态库,只需要重新编译库文件即可,不需要重新编译可执行文件
  3. 动态库在运行的时候才被载入,可以依靠程序控制库文件的载入时间
相关推荐
高hongyuan14 小时前
计算机网络
linux·计算机网络
祐言QAQ15 小时前
计算机网络之物理层——基于《计算机网络》谢希仁第八版
网络·网络协议·计算机网络
鸭鸭鸭进京赶烤17 小时前
数学建模:解锁智能计算的密码!
人工智能·计算机网络·算法·数学建模·信息可视化·机器人·信息与通信
LUCIAZZZ18 小时前
简单说一下什么是RPC
java·网络·网络协议·计算机网络·spring cloud·rpc
查理养殖场20 小时前
计算机网络之TCP的可靠传输
网络·tcp/ip·计算机网络
ZachOn1y1 天前
计算机网络:应用层 —— 动态主机配置协议 DHCP
网络·计算机网络·应用层·dhcp·408考研
苏苏大大2 天前
【八股】计算机网络
网络·计算机网络
听风吹等浪起2 天前
计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)
网络协议·tcp/ip·计算机网络·智能路由器
菠菠萝宝2 天前
【Java八股文】08-计算机网络面试篇
java·计算机网络·http·面试·https·udp·tcp
菜萝卜子2 天前
【计算机网络】数据链路层数据帧(Frame)格式
网络·计算机网络