深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)
庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。庫分靜態(tài)庫和動態(tài)庫兩種。
一、靜態(tài)庫和動態(tài)庫的區(qū)別
1. 靜態(tài)函數(shù)庫
這類庫的名字一般是libxxx.a;利用靜態(tài)函數(shù)庫編譯成的文件比較大--空間,因為整個函數(shù)庫的所有數(shù)據(jù)都會被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因為所有使用的函數(shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會成為他的缺點,因為如果靜態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。
2. 動態(tài)函數(shù)庫
這類庫的名字一般是libxxx.so;相對于靜態(tài)函數(shù)庫,動態(tài)函數(shù)庫在編譯的時候并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。由于函數(shù)庫沒有被整合進(jìn)你的程序,而是程序運行時動態(tài)的申請并調(diào)用--時間,所以程序的運行環(huán)境中必須提供相應(yīng)的庫。動態(tài)函數(shù)庫的改變并不影響你的程序,所以動態(tài)函數(shù)庫的升級/更新比較方便。
二、靜態(tài)庫
(一)簡單介紹
/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 為交叉編譯工具鏈
\為換行,表示下一行與當(dāng)行為同一行,‘\'后面不能有空格
main.c 為主函數(shù)
src/* 為源文件
-I后面接頭文件
-L后面接庫文件路徑路徑
-l后面接庫文件名,全名為libmpi.a
.a為靜態(tài)庫
(二)編寫及使用靜態(tài)庫
(1)設(shè)計庫源碼 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) 鏈接靜態(tài)庫
為了在編譯程序中正確找到庫文件,靜態(tài)庫必須按照 lib[name].a 的規(guī)則命名,如下例中[name]=pr.
ar參數(shù)意義:
r:在庫中插入模塊(替換)。當(dāng)插入的模塊名已經(jīng)在庫中存在,則替換同名的模塊。
s:寫入一個目標(biāo)文件索引到庫中,或者更新一個存在的目標(biāo)文件索引。
v:該選項用來顯示執(zhí)行操作選項的附加信息。
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 參數(shù)放在后面.其中,-L 加載庫文件路徑,-l 指明庫文件名字.
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr //生成main
(5)執(zhí)行目標(biāo)程序
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!
三、動態(tài)庫(隱式調(diào)用)
(1)設(shè)計庫代碼
[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)生成動態(tài)庫 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)動態(tài)庫的隱式調(diào)用
[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!
當(dāng)動態(tài)庫的位置發(fā)生改變時, 程序?qū)o法正常運行; 而動態(tài)庫取代靜態(tài)庫的好處之一則是通過更新動態(tài)庫而隨時升級庫的內(nèi)容.
上一篇:Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)解決方法
欄 目:C語言
下一篇:深入sizeof的使用詳解
本文標(biāo)題:深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4477.html
您可能感興趣的文章
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個結(jié)點的最低共同父結(jié)點的詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10深入解析最長公共子串
- 01-10深入理解鏈表的各類操作詳解
- 01-10深入N皇后問題的兩個最高效算法的詳解
- 01-10深入理解二叉樹的非遞歸遍歷
- 01-10深入全排列算法及其實現(xiàn)方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置