制作并使用动静态库
- 🏞️1. 动静态库概念
- 🌁2. 如何制作动静态库
- 📖2.1 制作静态库
- 📖2.2 制作动态库
- 🌠3. 如何使用动静态库
- 📖3.1 使用静态库
- 📖3.2 使用动态库
- 🍁4. 动态库的加载原理
🏞️1. 动静态库概念
静态库(.a):程序在编译链接时把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件运行之前,外部函数的机器码由操作系统从磁盘上的该动态库复制到内存中,这个过程称为动态链接
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间. 操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间.
🌁2. 如何制作动静态库
那么了解了动静态库的概念之后,如何制作动静态库呢?
📖2.1 制作静态库
现在,我们有一个.h
文件和对应的.c
文件,我们要将它们制作成静态库:
使用如下命令我们便可以将自己写的.c
文件制作成.a
静态库
当我们给别人使用这个静态库时,不仅要给别人静态库文件,.h
文件也需要,所以我们将.h
和.a
文件一起打包:
最终便可以生成静态库.
📖2.2 制作动态库
使用如下命令生成.so
文件.
将.so
文件与.h
文件一起打包:
🌠3. 如何使用动静态库
📖3.1 使用静态库
为了使用静态库,我们创建一个test
目录用于测试,并将我们的静态库拷贝到此目录下:
在mytest.c
中,我们使用静态库中包含的方法:
接着,当我们使用gcc
编译mytest.c
时,它会发生错误,提示我们找不到头文件和库文件,头文件的搜索路径:
- 在当前路径下查找头文件
- 在系统头文件路径下查找头文件
但我们的头文件和库文件都不在当前目录下,也不在系统路径中.
那么,如何解决这样的问题呢?
-
将头文件和库文件安装到系统路径中
-
指定头文件和库文件的搜索路径
📖3.2 使用动态库
使用动态库,与静态库一样,我们将我们制作的动态库与mytest.c
放在test
目录下:
接着,我们使用刚才的指定搜索路径的方式来编译mytest.c
:
可以看到,即便生成了mytest
可执行程序,但依然运行不起来,这是因为动态库是程序运行时才链接,也就是程序已经加载进内存并成为进程才去链接,它需要运行时搜索,而对gcc
指定路径只是编译时能够搜索到,运行时依然搜索不到.
如何解决呢?
-
将动态库拷贝到系统路径下,与静态库的方法一致,这里不再做演示.
-
通过导入环境变量的方式 – 程序运行时,会在环境变量中查找自己需要的动态库路径 环境变量 -
LD_LIBRARY_PATH
.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sss/系统编程/动静态库/mklib/lib-dyl/lib
当我们导入以后再次运行:
-
修改系统的配置文件
-
通过软链接