一、概述
二、靜態庫的優缺點
優點:
- 尋址方便,速度快
- 庫被打包到可執行程序中,直接發布可執行程序即可使用
缺點:
- 靜態庫的代碼在編譯過程中已經被載入可執行程序,因此體積較大
- 如果靜態函數庫改變了,那么你的程序必須重新編譯
使用場合:
- 在核心程序上使用,保證速度,可忽視空間
- 主流應用於80、90年代,現在很少用
三、靜態庫的制作
(1)制作步驟
1)編譯得到 *.o文件
gcc a.c b.c c.c -c
2)打包得到靜態庫 libmytest.a(就是一個打包.o文件的過程)
ar rcs libmytest.a a.o b.o c.o
- ar工具不包含在gcc中
- r–>將文件插入靜態庫中
- c–>創建靜態庫,不管庫是否存在
- s–>寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。
查看庫中的符號(函數、全局變量等):nm libmytest.a
3)使用靜態庫
gcc + 源文件 + -L靜態庫路徑 + 靜態庫名 + -l頭文件目錄 + o可執行文件名
gcc main.c -L ./-lmytest -l ./ -o app
- -L–>指定庫所在的路徑
- -l–>指定庫的名字
- 去掉前綴lib
- 去掉后綴 .a
- 只留下中間部分
- -l–>頭文件目錄位置
gcc + 源文件 + 頭文件 + libxxx.a
生成的靜態庫需要跟對應的頭文件同時發布
- 頭文件中存放的是函數接口(函數聲明)
(2)實際操作
文件內容及路徑分布如下:
gxl@gxl-virtual-machine:~/linux/jingtai$ tree
.
├── include
│ └── head.h
├── lib
├── main.c
└── src
├── add.c
└── sub.c
//head.h
//head.h
#include<stdio.h>
int add(int a, int b);
int sub(int a, int b);
//add.c
//add.c
#include"head.h"
int add(int a,int b)
{
return a+b;
}
//sub.c
//sub.c
#include"head.h"
int sub(int a,int b)
{
return a-b;
}
#include "head.h"
int main(void)
{
int a = 10, b = 10;
printf("%d + %d is %d\n", a, b, add(a, b));
printf("%d - %d is %d\n", a, b, sub(a, b));
return 0;
}
-
編譯為 .o 文件,進入到 src 目錄下執行:
-
將 .o 文件打包,制作成 libCalc.a 靜態庫
編譯時需要加靜態庫名(記得路徑),-I 包含頭文件 -
使用靜態庫編譯 main.c並執行 main,我們將 libCalc.a 移動到上層的 lib 中並退回到 calc 目錄,編譯 main.c 並執行:
-
可以用 nm 命令查看文件內容: