您好,登錄后才能下訂單哦!
這篇文章主要介紹“Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么”,在日常操作中,相信很多人在Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
對于靜態(tài)函數(shù)庫:在編譯鏈接時候,程序所需要的函數(shù)會從靜態(tài)函數(shù)庫中拷貝到執(zhí)行文件中。當程序運行的時候,就不需要鏈接外部的函數(shù)庫了。
1、靜態(tài)函數(shù)庫是多個目標文件*.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、若要使用靜態(tài)函數(shù)庫中的函數(shù),只需包含這些函數(shù)的聲明頭文件,并在編譯時候指明靜態(tài)函數(shù)庫的名字,編譯器會自從將函數(shù)拷貝到目標文件中。
4、生成的函數(shù)庫的命名規(guī)范為:lib+函數(shù)庫名。如,要生成一個test的函數(shù)庫,則命名為libtest.a
示例:
?。?)、分別創(chuàng)建三個文件:main.c、part_a.c、part_b.c
#include #include "part_a.h" int print_part_a(void) { printf("part A\n"); return 0; }
#include #include "part_b.h" int print_part_b(void) { printf("part B\n"); return 0; }
#include #include "part_a.h" #include "part_b.h" int main(void) { print_part_a(); print_part_b(); return 0; }
(2)、這里,我們創(chuàng)建三個目錄:src、include、lib,分別存放源文件、頭文件、庫文件,然后生成的目標文件就存放在當前目錄
?。?)、編寫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
?。?)、執(zhí)行./main文件,就會先后打印print_part_a()函數(shù)和print_part_b()函數(shù)的內容了
分析:我們用命令objdump -S main和objdump -S libtest.a進行反匯編查看可知,此時可執(zhí)行文件main中已經拷貝了靜態(tài)函數(shù)庫的函數(shù)了。
對于動態(tài)函數(shù)庫:在編譯鏈接時,程序所需要的函數(shù)不會從動態(tài)函數(shù)庫中拷貝出來,而是在程序運行的時候,才會將所需要的函數(shù)加載進來。
四、本文用到的命令及相關參數(shù)
gcc命令相關參數(shù)分析:
1、-Idirname :-I (注:是大I)可以指定頭文件路徑為dirname(./表示當前路徑 ../表示上一級目錄),并將其加入到程序頭文件目錄列表中。
例如:假設頭文件所在的目錄為include,那么輸入?yún)?shù)就為:-I ./include
2、-c :(注:是小c)只進行預編譯、匯編,生成目標文件.o
3、-Ldirname:-L 將所指出的目錄dirname加入到程序函數(shù)庫的目標列表中,即告訴鏈接腳本先到-L指定的目錄中尋找,然后到系統(tǒng)默認路徑中尋找。
例如:指定當前目錄,則輸入?yún)?shù)為:-L .
4、-lname:-l (注:是小L)可以指定鏈接時裝載名為libname.a的函數(shù)庫。
例如:若需要一個名為libtest.a的函數(shù)庫,則輸入?yún)?shù)為:-ltest
ar命令相關參數(shù)分析:
1、-r:將文件插入到庫文件中
2、-c:建立庫文件
3、-t:顯示庫文件中所包含的文件
4、-d:刪除庫文件中指定的成員文件
到此,關于“Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。