Linux靜態庫與動態庫

2021-08-04 16:33:03 字數 1659 閱讀 9198

靜態庫(.a):

靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大。

編譯程式時候需要庫作依賴,執行時候不需要。(方便,不再需要外部函式庫支援)

缺點:

1、因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間;

2、一旦庫中有bug,需要重新編譯。

建立步驟:

1、編寫函式介面(.c)

vim file1.c

.......

vim file2.c

....... 2、

編譯成.o檔案

gcc -o file1.o -c file1.c 

gcc -o file2.o -c file2.c 

3、打包成庫(庫名稱以lib開頭)

ar -crs libmy.a file1.o file2.o

4、靜態庫使用(

編譯程式)

gcc -o main main.c -l. -lmy

5、直接執行

動態庫(.so):

共享庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小。

編譯和執行程式都要有庫作依賴。

建立步驟:

1、編寫函式介面(.c)

vim file1.c

.......

vim file2.c

.......

2、編譯成.o檔案

-fpic:表示生成位置無關**(position independent code)

gcc 

-fpic

-o file1.o -c file1.c 

gcc  -fpic  -o file2.o -c file2.c 

3、打包成庫(庫名稱以lib開頭)

gcc -shared -fpic -o libmy.so file1.o file2.o

4、靜態庫使用(

編譯程式)

gcc -o main main.c -l. -lmy

5、 ①

設定lib環境變數 

export ld_library_path=$ld_library_path:庫存放的路徑

export ld_library_path=$ld_library_path:/mnt/hgfs/76期/系統程式設計/005/code/sharedlib

②直接把動態庫檔案拷貝到/lib或/usr/lib目錄下

③在/etc/ld.so.conf檔案裡加入我們生成的庫的目錄,然後/sbin/ldconfig

關於/etc/ld.so.conf:

裡面存放的是鏈結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib /lib中讀取的,所以想要順利執行,我們也可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig 

6、執行

檢視庫依賴(ldd):

ldd    檔案

看動態庫,如果目標程式沒有鏈結動態庫,則列印「not a dynamic executable」 (不是動態可執行檔案) 

linux動態庫與靜態庫

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

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

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

Linux中靜態庫與動態庫

在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...