.a
結尾的二進位制檔案,它作為程式的一個模組,在連結期間被組合到程式中。和靜態連結庫相對的是動態連結庫(.so
檔案),它在程式執行階段被載入進記憶體。libxxx.a
xxx 表示庫的名字。例如,libc.a、libm.a、libieee.a、libgcc.a 都是 Linux 系統自帶的靜態庫。.o
檔案:
gcc -c 原始檔列表
-c
選項表示只編譯,不連結,我們已在《GCC -c選項》中進行了講解。.o
檔案打包成靜態連結庫,具體格式為:
ar rcs + 靜態庫檔案的名字 + 目標檔案列表
ar 是 Linux 的一個備份壓縮命令,它可以將多個檔案打包成一個備份檔案(也叫歸檔檔案),也可以從備份檔案中提取成員檔案。ar 命令最常見的用法是將目標檔案打包為靜態連結庫。ar rcs libdemo.a a.o b.o c.o
#include “test.h” int add(int a,int b) { return a + b; }sub.c 實現兩個數相減,程式碼展示如下:
#include “test.h” int sub(int a,int b) { return a - b; }div.c 實現兩個函數相除,程式碼展示如下:
#include “test.h” int div(int a,int b) { return a / b; }還有一個 test.h 標頭檔案,用來宣告三個函數,程式碼展示如下:
#ifndef __TEST_H_ #define __TEST_H_ int add(int a,int b); int sub(int a,int b); int div(int a,int b); #endif
gcc -c *.c
*.c
表示所有以.c
結尾的檔案,也即所有的原始檔。執行完該命令,會發現 test 目錄中多了三個目標檔案,分別是 add.o、sub.o 和 div.o。ar rcs libtest.a *.o
*.o
表示所有以.o
結尾的檔案,也即所有的目標檔案。執行完該命令,發現 test 目錄中多了一個靜態庫檔案 libtest.a,大功告成。[c.biancheng.net ~]$ cd test [c.biancheng.net test]$ gcc -c *.c [c.biancheng.net test]$ ar rcs libtest.a *.o
|-- include | `-- test.h |-- lib | `-- libtest.a `-- src `-- main.c
#include <stdio.h> #include "test.h" //必須引入標頭檔案 int main(void) { int m, n; printf("Input two numbers: "); scanf("%d %d", &m, &n); printf("%d+%d=%dn", m, n, add(m, n)); printf("%d-%d=%dn", m, n, sub(m, n)); printf("%d÷%d=%dn", m, n, div(m, n)); return 0; }在編譯 main.c 的時候,我們需要使用
-I
(大寫的字母i
)選項指明標頭檔案的包含路徑,使用-L
選項指明靜態庫的包含路徑,使用-l
(小寫字母L
)選項指明靜態庫的名字。所以,main.c 的完整編譯命令為:
gcc src/main.c -I include/ -L lib/ -l test -o math.out
注意,使用-l
選項指明靜態庫的名字時,既不需要lib
字首,也不需要.a
字尾,只能寫 test,GCC 會自動加上字首和字尾。./math.out
命令就可以執行 math.out 進行數學計算。[c.biancheng.net ~]$ cd math [c.biancheng.net math]$ gcc src/main.c -I include/ -L lib/ -l test -o math.out [c.biancheng.net math]$ ./math.out Input two numbers: 27 9↙ 27+9=36 27-9=18 27÷9=3