Linux的靜態庫與動態庫的建立

2021-10-24 19:32:02 字數 2668 閱讀 5329

我們在使用每一種程式語言時都會遇到函式庫的概念,只需要新增某個標頭檔案,就可以呼叫其中提供的各種函式介面,簡單便捷的實現多種功能。本文將向大家介紹在linux系統中,如何建立c語言的靜態函式庫和動態函式庫。

靜態庫在程式編譯時會被鏈結到目標**中,在程式執行時便不再需要相應靜態庫檔案。

1、建立相關原始檔

主程式main.c求和sub1.c乘積sub2.c主函式標頭檔案sub.h

main.c

#

include

"stdio.h"

#include

"sub.h"

void

main()

sub.h

#

ifndef

sub_h

//防止重定義

#define

sub_h

float

x2x(

float a,

float b)

;float

y2y(

float a,

float b);#

endif

sub1.c

#

include

float

x2x(

float a,

float b)

sub2.c

#

include

float

y2y(

float a,

float b)

2、編譯中間過程的.o目標檔案

gcc -c sub1.c sub2.c
此時目錄中有以下檔案

3、ar工具建立靜態庫

ar -crv libsub.a sub1.o sub2.o
執行完後,在目錄中會生成 libsub.a

4、將靜態庫鏈結到主程式

gcc-o float -l. main.c –lsub  //方法一,適用於自定義庫(最後為l+庫名)

gcc main.c libsub.a -o float //方法二

先生成 main.o: gcc -c main.c //方法三

再生成可執行檔案:gcc -o float main.o libsub.a

float 即為生成的可執行檔案

5、執行結果

6、刪掉靜態庫檔案後再次執行

可見,刪掉靜態庫後,程式依然可以執行成功,說明靜態庫中的函式已新增到可執行檔案中,程式執行時可不再依賴靜態庫。

動態庫也叫共享庫,檔名命名規範和靜態庫檔名命名規範類似,也是在動態庫名增加字首 lib,但其 擴充套件名為.so。例如:我們將建立的動態庫名為 myhello,則動態庫檔名就是 libmyh ello.so。注意動態庫存放位置

1、繼續用 sub1.o 和 sub2.o 建立動態鏈結庫

gcc -shared -fpic -o libsub.so sub1.o sub2.o
注意命令引數個數

執行後即會生成 libsub.so 檔案

2、在程式中鏈結動態庫,此處使用上述的方法二

gcc main.c libsub.so -o float
3、命令執行後會產生可執行檔案 float , 執行 float 但會出現以下錯誤

這是由於我們雖然使用的是當前目錄下的動態庫檔案,但系統會自動到 /usr/lib 目錄下尋找動態庫,所以我們需要將庫檔案移動或複製到該目錄下

sudo

cp libsub.so /usr/lib

之後再次執行 float

4、由以上步驟我們可以得知,程式鏈結到動態庫,在執行時是要依賴動態庫檔案的,如果庫檔案不在指定目錄,程式便不能執行。

既然有兩種庫,自然就要有優先順序,如果有同名的靜態庫與動態庫,程式將選擇哪乙個呢?

1、將剛才複製到 /usr/lib 目錄中的動態庫檔案 與 可執行檔案 刪掉,然後用方法一鏈結庫與主程式,因為二三種方法會指定庫的型別。

cd /usr/lib

sudo

rm libsub.so

cd -

gcc -o float -l. main.c -lsub

2、執行 float

如圖,出現了上文中鏈結動態庫時的問題,所以在有同名庫時,系統會自動優先選擇動態庫。

Linux靜態庫與動態庫

靜態庫 a 靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。編譯程式時候需要庫作依賴,執行時候不需要。方便,不再需要外部函式庫支援 缺點 1 因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間 2 一旦庫中有bug,需要重新編譯。建立步驟 1 編寫函...

linux動態庫與靜態庫

現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...

Linux下的靜態庫與動態庫

準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...