一、在linux中,有兩種函式庫,以*.so字尾命名的是動態函式庫,以*.a字尾命名的是靜態函式庫
二、靜態函式庫
1、靜態函式庫是多個目標檔案*.o的集合
2、可以使用ar命令(archiver)來生成.a檔案
gcc -c part_a.c3、若要使用靜態函式庫中的函式,只需包含這些函式的宣告標頭檔案,並在編譯時候指明靜態函式庫的名字,編譯器會自從將函式拷貝到目標檔案中。gcc -c part_b.c
ar -r libtest.a part_a.o part_b.o
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(2)、這裡,我們建立三個目錄:src、include、lib,分別存放原始檔、標頭檔案、庫檔案,然後生成的目標檔案就存放在當前目錄"part_a.h
"#include
"part_b.h
"int main(void
)
(3)、編寫makefile
include += -i./include(4)、執行./main檔案,就會先後列印print_part_a()函式和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
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到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...