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)
intsubtract
(int a, int b)
使用gcc,為這兩個原始檔生成目標檔案:
gcc -c my_print.c my_math.c
我們就得到了 my_print.o 和 my_math.o。
我們使用 ar 將目標檔案歸檔:
ar
crvlibmylib
.amy_print
.omy_math
.o
我們就得到了libmylib.a,這就是我們需要的靜態庫。
上述命令中 crv 是 ar的命令選項:
通過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__
intadd
(int a, int b)
;int
subtract
(int a, int b)
;void
cout
(const
char *)
;#endif
在同樣的目錄下,建立 test.c:
#include
"my_lib.h"
intmain
(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吧,內容如下:
.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上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...
Linux靜態庫生成指南
linux上的靜態庫,其實是目標檔案的歸檔檔案。在linux上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...
Linux 靜態庫生成
linux上的靜態庫,其實是目標檔案的歸檔檔案。在linux上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...