Linux C/C++編程之(九)靜態庫的製作和使用

一、概述

在這裏插入圖片描述

二、靜態庫的優缺點

優點:

  • 尋址方便,速度快
  • 庫被打包到可執行程序中,直接發佈可執行程序即可使用

缺點:

  • 靜態庫的代碼在編譯過程中已經被載入可執行程序,因此體積較大
  • 如果靜態函數庫改變了,那麼你的程序必須重新編譯

使用場合:

  • 在覈心程序上使用,保證速度,可忽視空間
  • 主流應用於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 命令查看文件內容:
    在這裏插入圖片描述

四、靜態庫

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章