Linux 動態庫與靜態庫的概念及建立使用

2021-10-22 15:45:04 字數 2596 閱讀 2349

靜態鏈結的優缺點:程式執行沒有其他依賴,可以直接執行;裝載速度快,但是可執行程式比較大,並如果多個程式使用同乙個庫中的函式,則這個函式的**在執行時記憶體就會有多份相同的庫函式**,會造成冗餘。

在我們寫**的時候,會有很多重複利用到的函式和**,當打包成庫,就可以在任何地方使用該函式和**,這樣子大大提高了我們的程式設計效率。現在我們來看看如何打包乙個庫函式

示例**:

child.c

#include

intprintchild()

child.h

intprintchild()

;

main.c

#include

#include

"child.h"

intmain()

1、將各個.c檔案編譯彙編成為目標檔案

gcc -c -fpic child.c -o child.o

2、打包成以.so為結尾的動態庫

gcc -share child.o -o libmychild.so; 動態庫的命名方式lib***.so

動態庫的使用有3種方式

生成可執行檔案時鏈結使用gcc main.c -o main -lmychild-l指定庫名稱

但是我們發現說並找不到庫檔案,鏈結前還需要將我們的庫配置好,動態庫有3種方法

1、將庫檔案放到指定路徑下:/usr/lib64or/usr/lib

但是放在系統庫中會汙染我門的原來的庫

2、設定鏈結庫的搜尋路徑環境變數-將庫檔案所在路徑新增進去:export library_path=$library_path:.

3、使用gcc -l選項指定鏈結庫的搜尋路徑

gcc main.c -o main -l./ -lmychild

ldd main檢視main這個可執行程式依賴的動態庫

我們雖然可以鏈結成功,但是我們並不能成功執行main程式

執行可執行程式時載入使用方法

1、將庫檔案放到指定路徑下:/usr/lib64or/usr/lib64

2、設定鏈結庫的接在路徑環境變數-將庫檔案所在路徑新增進去:export ld_library_path=$ld_library_path:.

如果鏈結的是動態庫,執行時就需要載入動態庫;如果鏈結的是靜態庫,執行時就不需要載入

1、將各個.c檔案編譯彙編成為目標檔案

gcc -c child.c -o child1.o

2、打包成以.a為結尾的靜態庫

ar -cr libmyachild.a child1.o; 靜態庫的命名方式lib***.a

如何讓程式鏈結的是靜態庫:

1、將靜態庫放到指定路徑下

gcc 預設使用動態庫,那麼我們如何讓他使用靜態庫呢?

將我們的靜態庫放到乙個檔案中,讓它鏈結時去該目錄下找,由於該目錄只有靜態庫,此時就只能使用靜態庫gcc main.c -o main -l./lib -mychild

在新版本的linux 系統下安裝 glibc-devel、glibc和gcc-c++時,都不會安裝libc.a. 只安裝libc.so. 所以當使用-static時,libc.a不能使用。只能報找不到libc了。

解決方法:

安裝glibc-static

sudo yum install glibc-static

Linux靜態庫與動態庫

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

linux動態庫與靜態庫

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

Linux 靜態庫與動態(共享)庫

不論是在linux還是windows下程式設計,我們都會用到庫,有自身帶的標準庫,也有我們自己寫的庫,庫就是預先編譯好的的方法的集合。linux中的庫可以分為兩種,靜態庫和動態庫,動態庫也稱為共享庫。在linux中,庫名稱都以lib開始,靜態庫名為 lib a,動態庫名為 lib so。靜態庫和動態...