1. 静态库与动态库
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
- 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
- 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
- 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
2.静态库
生成静态库
bash
ar -rc libxxx.a add.o sub.o
查看静态库中的目录列表
bash
ar -tv libxxx.a
t:列出静态库中的文件
v:verbose 详细信息
链接静态库
-L 指定库路径 -l 指定库名 测试目标文件生成后,静态库删掉,程序照样可以运行。
库搜索路径
- 从左到右搜索-L指定的目录。
- 由环境变量指定的目录
- (LIBRARY_PATH) 由系统指定的目录
/usr/lib
- /usr/local/lib
3. 动态库
生成动态库
- shared: 表示生成共享库格式
- fPIC:产生位置无关码(position independent code)
- 库名规则:libxxx.so
使用动态库
编译选项
- l:链接动态库,只要库名即可(去掉lib以及版本号)
- L:链接库所在的路径.
这里有一个让我疑惑的点
这里如果不是一步到位
而是这样使用
如下形成的两个.gch不能被打包静态库的命令识别
通过动态库编译1形成可执行文件