linux上的靜態庫,其實是目標檔案的歸檔檔案。
在linux上建立靜態庫的步驟如下:
寫原始檔,通過 gcc -c ***.c 生成目標檔案。
用 ar 歸檔目標檔案,生成靜態庫。
配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。
使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。
下面通過例項具體講解。
寫原始檔,生成目標檔案。
第乙個原始檔 my_print.c
#include
void
cout(const
char * message)
原始檔2: my_math.c
int add(int a, int b)
int subtract(int a, int b)
使用這裡寫**片
gcc,為這兩個原始檔生成目標檔案:
gcc -c my_print.c my_math.c
我們就得到了 my_print.o 和 my_math.o。
歸檔目標檔案,得到靜態庫。
我們使用 ar 將目標檔案歸檔:
ar crv libmylib.a my_print.o my_math.o
我們就得到了libmylib.a,這就是我們需要的靜態庫。
上述命令中 crv 是 ar的命令選項:
c 如果需要生成新的庫檔案,不要警告
r 代替庫中現有的檔案或者插入新的檔案
v 輸出詳細資訊
通過 ar t libmylib.a 可以檢視 libmylib.a 中包含的目標檔案。
注意:我們要生成的庫的檔名必須形如 lib***.a ,這樣我們在鏈結這個庫時,就可以用 -l***。
反過來講,當我們告訴編譯器 -l***時,編譯器就會在指定的目錄中搜尋 lib***.a 或是 lib***.so。
生成對應的標頭檔案
標頭檔案定義了 libmylib.a 的介面,也就是告訴使用者怎麼使用 libmylib.a。
新建my_lib.h, 寫入內容如下:
#ifndef __my_lib_h__
#define __my_lib_h__
int add(int a, int b);
int subtract(int a, int b);
void cout(const
char *);
#endif
測試我們這裡寫**片
的靜態庫
在同樣的目錄下,建立 test.c:
#include "my_lib.h"
int main(int argc, char *argv)
這個原始檔中引用了 libmylib.a 中的 cout 和 add 函式。
編譯test.c:
gcc test.c -l. -lmylib
將會生成a.out,通過 ./a.out 可以執行該程式。說明我們的靜態庫能正常工作。
上面的命令中 -l. 告訴 gcc 搜尋鏈結庫時包含當前路徑, -lmylib 告訴 gcc 生成可執行程式時要鏈結 libmylib.a。
通過makefile自動化
上面的步驟很繁瑣,還是寫個簡單的makefile吧,內容如下:
.phony: build test
build: libmylib.a
libmylib.a: my_math.o my_print.o
ar crv $@ my_math.o my_print.o
my_math.o: my_math.c
gcc -c my_math.c
my_print.o: my_print.c
gcc -c my_print.c
test: a.out
a.out: test.c
gcc test.c -l. -lmylib
makefile寫好後,執行 make build 將會構建 libmylib.a, 執行 make test 將會生成鏈結 libmylib.a 的程式。
如果你在 windows 上使用 mingw,和linux下生成靜態庫的方法是一樣的。
在Linux中建立靜態庫和動態庫
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...
在Linux中建立靜態庫和動態庫
我們通常把一些公用函式 製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜...
Linux建立靜態庫
1 gcc c joker.c mac.c 建立.o檔案,已編譯,未鏈結的檔案。2 ar crv libfoo.a joker.o mac.o 對.o檔案歸檔,把一組小的檔案集中到乙個大檔案中,使用ar可以把任何型別的檔案歸為檔案。3 ranlib libfoo.a 為這個庫建立乙個內容表。可以這樣...