深入探討Linux靜態庫與動態庫的詳解(一看就懂)

來源:互聯網
上載者:User

庫從本質上來說是一種可執行代碼的二進位格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。
一、靜態庫和動態庫的區別
1. 靜態函數庫
這類庫的名字一般是libxxx.a;利用靜態函數庫編譯成的檔案比較大--空間,因為整個函數庫的所有資料都會被整合進目標代碼中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函數庫支援,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函數庫改變了,那麼你的程式必須重新編譯。
2. 動態函數庫
這類庫的名字一般是libxxx.so;相對於靜態函數庫,動態函數庫在編譯的時候並沒有被編譯進目標代碼中,你的程式執行到相關函數時才調用該函數庫裡的相應函數,因此動態函數庫所產生的可執行檔比較小。由於函數庫沒有被整合進你的程式,而是程式運行時動態申請並調用--時間,所以程式的運行環境中必須提供相應的庫。動態函數庫的改變並不影響你的程式,所以動態函數庫的升級/更新比較方便。

二、靜態庫

(一)簡單介紹
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc \
main.c src/* -I./include -L./lib -lmpi -o main
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc 為交叉編譯工具鏈
\為換行,表示下一行與當行為同一行,‘\'後面不能有空格
main.c 為主函數
src/* 為源檔案
-I後面接標頭檔
-L後面接庫檔案路徑路徑
-l後面接庫檔案名稱,全名為libmpi.a
.a為靜態庫

(二)編寫及使用靜態庫
(1)設計庫源碼 pr1.c、pr2.c 和 main.c複製代碼 代碼如下:[bill@billstone make_lib]$ cat pr1.c
#include <stdio.h>
void print1(void)
{
printf("This is the first lib src!\n");
}
[bill@billstone make_lib]$ cat pr2.c
#include<stdio.h>
void print2(void)
{
printf("This is the second src lib!\n");
}
[bill@billstone make_lib]$ cat main.c
int main(void)
{
print1();
print2();
return 0;
}

(2) 編譯pr1.c、pr2.c 檔案複製代碼 代碼如下:[bill@billstone make_lib]$ gcc -O -c pr1.c pr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr1.o
-rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr2.o

(3) 連結靜態庫
為了在編譯器中正確找到庫檔案,靜態庫必須按照 lib[name].a 的規則命名,如下例中[name]=pr.
ar參數意義:
r:在庫中插入模組(替換)。當插入的模組名已經在庫中存在,則替換同名的模組。
s:寫入一個目標檔案索引到庫中,或者更新一個存在的目標檔案索引。
v:該選項用來顯示執行操作選項的附加資訊。
t:顯示庫的模組表清單。一般只顯示模組名。
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4) 編譯連結選項
-L 及-l 參數放在後面.其中,-L 載入庫檔案路徑,-l 指明庫檔案名稱字.
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr //產生main
(5)執行目標程式
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!

三、動態庫(隱式調用)
(1)設計庫代碼 複製代碼 代碼如下:[bill@billstone make_lib]$ cat pr1.c
#include <stdio.h>
int p = 2;
void print(){
printf("%p:%d\n", &p, p);
printf("This is the first dll src!\n");
}

(2)產生動態庫 xxx.so複製代碼 代碼如下:[bill@billstone make_lib]$ gcc -O -fpic -shared -o xxx.so pr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x 1 bill bill 6592 4 月 15 15:19 xxx.so

(3)動態庫的隱式調用
複製代碼 代碼如下:[bill@billstone make_lib]$ cat main.c
int main()
{
print();
return 0;
}
[bill@billstone make_lib]$ gcc -o main main.c ./xxx.so
[bill@billstone make_lib]$ ./main
0x97b5d4:2
this is the first lib src!

當動態庫的位置發生改變時, 程式將無法正常運行; 而動態庫取代靜態庫的好處之一則是通過更新動態庫而隨時升級庫的內容.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.