Linux 靜態庫使用

2021-08-11 15:16:30 字數 2292 閱讀 9605

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 中的coutadd函式。

編譯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 ...