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 命令查看文件內容:
    在這里插入圖片描述

四、靜態庫

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM