1. 程式人生 > >Linux下建立、檢視、提取和修改靜態庫(*.a)

Linux下建立、檢視、提取和修改靜態庫(*.a)

先說明一點,靜態庫檔案是由多個目標檔案打包而成的,在windows下靜態庫檔案的字尾是.lib,而在linux下靜態庫檔案的字尾是.a(a是archive的縮寫,也就是文件檔案)。

  廢話少說,下面直接進入主題。

  1.建立兩個c檔案:addition.c 和 multiplication.c

addition.c

複製程式碼

1 //addition.c
2 int addition (int a ,int b)
3 {
4 int result;
5 result=a+b;
6 return result;
7 }

複製程式碼

multiplication.c

複製程式碼

1 //multiplication.c
2 int multiplication
3 {
4 int result;
5 result=a*b;
6 return result;
7 }

複製程式碼

  2.編譯C檔案得到.o目標檔案

1 $ gcc -c addition.c
2 $ gcc -c multiplication.c

其中選項 -c 是讓gcc只把原始碼編譯成.o檔案。

接著在當前資料夾中就會發現多處了兩個.o檔案

1 $ ls
2 addition.c multiplication.c addition.o multiplication.o

  3. 用ar命令來建立靜態庫檔案

1 $ ar cr libarith.a  addition.o multiplication.o

其中cr就是create的意思,這樣就建立了一個libarith.a的靜態庫檔案。

  4.寫一個c程式來呼叫libarith.a庫

在使用庫檔案之前要先建立一個頭檔案 header.h,它包含了庫檔案中實現了函式的宣告。

1 //header.h
2 #include<stdio.h>
3 int addition(int a,int b);
4 int multiplication(int a,int b);

然後建立一個c程式example.c來呼叫函式

複製程式碼

 1 // example.c
 2 #include "header.h"
 3 int main()
 4 {
 5 int result;
 6 result=addition(1,2);
 7 printf("addition result is :%d\n",result);
 8 result=multiplition(3,4);
 9 printf("multiplication result is:%d\n",result);
10 return 0;
11 }

複製程式碼

編譯example.c

1 $ gcc example.c libarith.a -o example

選項 -o 後面的引數是指定編譯器生成的可執行檔名,如果沒有加 -o的話預設生成的可執行檔名是 a.out

執行可以行檔案example

1 $./example
2 addtion result is:3
3 multiplication result is:12

  5.檢視庫檔案中的目標檔案

1 $ ar t libarith.a
2 addition.o
3 multiplition.o

如果想檢視庫檔案中包含了哪些函式可以用 nm  libarith.a 檢視,如果要檢視可執行檔案需要呼叫哪些庫可以用 lld example 來檢視。

  6.從庫檔案中提取目標檔案

複製程式碼

1 $ mkdir file
2 $ cp libarith.a file/
3 $ cd file
4 $ ar x libarith.a
5 $ ls
6 addition.o
7 multiplition.o

複製程式碼

  7.新增一個目標檔案到庫檔案中

假設你已經有一個目標檔案subtraction.o

1 $ ar r libarith.a subtraction.o
2 $ ar t libarith.a
3 addition.o
4 multiplication.o
5 subtraction.o

如果庫檔案中已經存在了subtraction.o檔案,則會用新的來覆蓋原來舊的。

  8.刪除庫檔案中指定的目標檔案

1 $ ar d libarith.a addition.o
2 $ ar t libarith.a
3 multiplication.o
4 subtraction.o