Linux的靜態函式庫和動態函式庫

2022-08-31 14:24:23 字數 2086 閱讀 5538

一、在linux中,有兩種函式庫,以*.so字尾命名的是動態函式庫,以*.a字尾命名的是靜態函式庫

二、靜態函式庫

1、靜態函式庫是多個目標檔案*.o的集合

2、可以使用ar命令(archiver)來生成.a檔案

gcc -c part_a.c

gcc -c part_b.c

ar -r libtest.a part_a.o part_b.o

3、若要使用靜態函式庫中的函式,只需包含這些函式的宣告標頭檔案,並在編譯時候指明靜態函式庫的名字,編譯器會自從將函式拷貝到目標檔案中。

4、生成的函式庫的命名規範為:lib+函式庫名。如,要生成乙個test的函式庫,則命名為libtest.a

示例:(1)、分別建立三個檔案:main.c、part_a.c、part_b.c

#include #include 

"part_a.h

"int print_part_a(void

)

#include #include 

"part_b.h

"int print_part_b(void

)

#include #include 

"part_a.h

"#include

"part_b.h

"int main(void

)

(2)、這裡,我們建立三個目錄:src、include、lib,分別存放原始檔、標頭檔案、庫檔案,然後生成的目標檔案就存放在當前目錄

(3)、編寫makefile

include += -i./include

src += ./src

lib += ./lib

lib_file += $(lib)/libtest

all: lib

gcc $(include) -o main $(src)/main.c -l$(lib) -ltest

lib: $(src)/part_a.o $(src)/part_b.o

ar -r $(lib_file).a $(file_a_obj) $(file_b_obj)

$(src)/part_a.o: $(src)/part_a.c

gcc $(include) -c $(src)/part_a.c

$(src)/part_b.o: $(src)/part_b.c

gcc $(include) -c $(src)/part_b.c

(4)、執行./main檔案,就會先後列印print_part_a()函式和

print_part_b()函式的內容了

分析:我們用命令objdump -s main和objdump -s libtest.a進行反彙編檢視可知,此時可執行檔案main中已經拷貝了靜態函式庫的函式了。    

三、動態函式庫(暫無。。)

1、-idirname :-i (注:是大i)可以指定標頭檔案路徑為dirname(./表示當前路徑   ../表示上一級目錄),並將其加入到程式頭檔案目錄列表中。

例如:假設標頭檔案所在的目錄為include,那麼輸入引數就為:-i ./include

2、-c :(注:是小c)只進行預編譯、彙編,生成目標檔案.o

3、-ldirname:-l 將所指出的目錄dirname加入到程式函式庫的目標列表中,即告訴鏈結指令碼先到-l指定的目錄中尋找,然後到系統預設路徑中尋找。

例如:指定當前目錄,則輸入引數為:-l .

4、-lname:-l (注:是小l)可以指定鏈結時裝載名為libname.a的函式庫。

例如:若需要乙個名為libtest.a的函式庫,則輸入引數為:-ltest

1、-r:將檔案插入到庫檔案中

2、-c:建立庫檔案

3、-t:顯示庫檔案中所包含的檔案

4、-d:刪除庫檔案中指定的成員檔案

Linux 下的靜態(函式)庫 動態(函式)庫

不用指定生成.o檔名 預設生成file1.o,file2.o,file3.o ar rv libname.a file1.o file2.o file3.or 將flie1.o,file2,o,file3.o插入archive,如故原先archive中已經存在某檔案,則先將該檔案刪除。v 顯示ar操...

Linux應用開發 靜態函式庫和動態函式庫

什麼叫庫?就是一些函式經過一定的操作生成的可執行的二進位制檔案,能夠被外部呼叫使用封裝的函式。linux應用程式所使用的主要函式庫均存放於 lib和 usr lib目錄下,其中以 so方式命名的是動態函式庫,以 a命令的是靜態函式庫,linux下進行鏈結時預設使用動態函式庫,如果想要使用靜態函式庫時...

靜態函式庫與動態函式庫的設計

函式庫存放位置 linux應用程式使用的主要函式均放在 lib和 usr lib目錄下,其中採用 so.命名的是動態函式庫,而以 a方式命名的是靜態函式庫。靜態函式庫的特點 程式所要用到的庫函式 在鏈結時全部被copy到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...