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動態庫與靜態庫使用比較
在windows下,動態庫dll的使用往往伴隨著lib的指引,而linux使用動態庫和靜態庫則有較大的不同。1.靜態庫 名字一般是lib a 利用靜態函式庫編譯成的檔案比較大,因為整個 函式庫的所有資料都會被整合進目標 中,編譯後的執行程式不需要外部的函式庫支援,但是,公升級比較麻煩。每一次版本更新...
linux 靜態庫,動態庫簡單使用示例
nm 命令可以看二進位制檔案的符號 預編譯 去掉巨集 gcc e hello.c o hello.i 編譯 高階語言 彙編 gcc s hello.i 彙編 彙編 目標檔案 gcc c hello.s 鏈結 gcc hello.o o hello h 原始碼標頭檔案 c 預處理前的原始碼 i 預處理...
Linux靜態庫與動態庫的使用
一 linux基本操作命令 首先建立unsgn pow.c檔案,包含unsgn pow 函式的定義 建立檔案 root localhost cd home root localhost home mkdir aiy root localhost home cd aiy root localhost ...