Linux靜態庫生成指南

2021-08-15 06:28:11 字數 2292 閱讀 7209

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靜態庫生成指南

linux上的靜態庫,其實是目標檔案的歸檔檔案。在linux上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...

Linux靜態庫生成指南

linux上的靜態庫,其實是目標檔案的歸檔檔案。在linux上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...

Linux 靜態庫生成

linux上的靜態庫,其實是目標檔案的歸檔檔案。在linux上建立靜態庫的步驟如下 寫原始檔,通過gcc c c生成目標檔案。用ar歸檔目標檔案,生成靜態庫。配合靜態庫,寫乙個使用靜態庫中函式的標頭檔案。使用靜態庫時,在原始碼中包含對應的標頭檔案,鏈結時記得鏈結自己的庫。下面通過例項具體講解。第乙個...