Linux靜態庫生成指南
Linux上的靜態庫,其實是目標文件的歸檔文件。
在Linux上創建靜態庫的步驟如下:
寫源文件,通過
gcc -c xxx.c
生成目標文件。
用
ar
歸檔目標文件,生成靜態庫。
配合靜態庫,寫一個使用靜態庫中函數的頭文件。
使用靜態庫時,在源碼中包含對應的頭文件,鏈接時記得鏈接自己的庫。
下面通過實例具體講解。
寫源文件,生成目標文件。
第一個源文件 my_print.c
[code]#include <stdio.h>
void cout(const char * message)
{
fprintf(stdout, "%s\n", message);
}
源文件2: my_math.c
[code]int add(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
使用gcc,為這兩個源文件生成目標文件:
[code]gcc -c my_print.c my_math.c
我們就得到了 my_print.o 和 my_math.o。
歸檔目標文件,得到靜態庫。
我們使用 ar 將目標文件歸檔:
[code]ar crv libmylib.a my_print.o my_math.o
我們就得到了libmylib.a,這就是我們需要的靜態庫。
上述命令中 crv 是 ar的命令選項:
c 如果需要生成新的庫文件,不要警告
r 代替庫中現有的文件或者插入新的文件
v 輸出詳細信息
通過
ar t libmylib.a
可以查看
libmylib.a
中包含的目標文件。
可以通過
ar --help
查看更多幫助。
注意:我們要生成的庫的文件名必須形如
libxxx.a
,這樣我們在鏈接這個庫時,就可以用
-lxxx
。
反過來講,當我們告訴編譯器
-lxxx
時,編譯器就會在指定的目錄中搜索
libxxx.a
或是
libxxx.so
。
生成對應的頭文件
頭文件定義了 libmylib.a 的接口,也就是告訴用戶怎麼使用 libmylib.a。
新建my_lib.h, 寫入內容如下:
[code]#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:
[code]#include "my_lib.h"
int main(int argc, char *argv[])
{
int c = add(15, -21);
cout("I am a func from mylib ...");
return 0;
}
這個源文件中引用了 libmylib.a 中的
cout
和
add
函數。
編譯test.c:
[code]gcc test.c -L. -lmylib
將會生成a.out,通過 ./a.out 可以運行該程序。說明我們的靜態庫能正常工作。
上面的命令中
-L.
告訴 gcc 搜索鏈接庫時包含當前路徑,
-lmylib
告訴 gcc 生成可執行程序時要鏈接
libmylib.a
。
通過makefile自動化
上面的步驟很繁瑣,還是寫個簡單的makefile吧,內容如下:
[code].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, gcc