溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么

發(fā)布時間:2022-01-27 14:53:08 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么”,在日常操作中,相信很多人在Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Linux靜態(tài)函數(shù)庫和動態(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ù)了。

Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么 Linux靜態(tài)函數(shù)庫和動態(tài)函數(shù)庫是什么

動態(tài)函數(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>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI