文章目录
库有两种:静态库(.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");,这样就可以运行了
总结
使用步骤:
- 把头文件拷贝到当前项目中,添加头文件依赖
- 把库文件拷贝到当前项目中,添加库文件依赖
动态库实践
使用方法
先创建一个动态链接库文件,与静态库一样,这里也有四个文件
我们在这个文件中写两个函数(为了比较),一个加法函数,一个减法函数
我们在声明减法函数的前面写上_declspec(dllexport),因为只有声明导出,才会在索引文件中生成索引
实现这两个函数
然后我们旋转生成解决方案,可以看到,生成了一个.lib索引文件和一个.dll
我们去对应路径下找到他们,然后拷贝到静态库实践中我们创建的那个测试项目中,当然那两个头文件也需要拷贝过来
如果是静态库,到此为止已经可以正常执行了,但我们在运行的时候发现会出现找不到dll文件的错误,原因是我们需要将dll拷贝到exe同文件下
这样就可以了
我们知道静态库有一个优点,就是在库文件更新时,只需要重新编译库并把库提供给别人,别人不需要重新执行可执行文件就可以执行exe
我们在刚才动态库中的代码修改一下,然后重新生成一下
再将用户的exe同文件下的dll替换就可以,我们点击exe可以发现执行结果已经做出改变
总结
使用步骤:
- 把头文件拷贝到当前项目中,添加头文件依赖
- 把索引文件拷贝到当前项目中,添加索引文件依赖
- 把dll拷贝到exe同文件下
静态库与动态库的优缺点
静态库
优点
运行速度比动态库快
缺点
- 浪费内存空间,当多个应用程序依赖同一个静态库,在内存中要拷贝多份
- 更新部署发布比较麻烦,修改静态库代码,不止要重新编译库文件,还需要重新编译整个可执行文件
动态库
缺点
运行速度比静态库慢
优点
- 节省内存空间,当多个应用程序依赖同一个动态库,在内存中只需要拷贝一份
- 更新部署发布简单,修改动态库,只需要重新编译库文件即可,不需要重新编译可执行文件
- 动态库在运行的时候才被载入,可以依靠程序控制库文件的载入时间