===================">
linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

ID:29883055

大小:79.01 KB

頁(yè)數(shù):10頁(yè)

時(shí)間:2018-12-24

linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)_第1頁(yè)
linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)_第2頁(yè)
linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)_第3頁(yè)
linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)_第4頁(yè)
linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)_第5頁(yè)
資源描述:

《linux鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。

1、[Linux]鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)Filename:[Linux]鏈接,靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)Version:V1.0Date:12/01/2009Author:S.C.Leon=====================================================================在Linux中創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)一、基本概念1.1什么是庫(kù)在windows平臺(tái)和linux平臺(tái)下都大量存在著庫(kù)。本質(zhì)上來(lái)說(shuō)庫(kù)是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作

2、系統(tǒng)載入內(nèi)存執(zhí)行。由于windows和linux的平臺(tái)不同(主要是編譯器、匯編器和連接器的不同),因此二者庫(kù)的二進(jìn)制是不兼容的。本文僅限于介紹linux下的庫(kù)。??1.2庫(kù)的種類linux下的庫(kù)有兩種:靜態(tài)庫(kù)和共享庫(kù)(動(dòng)態(tài)庫(kù))。二者的不同點(diǎn)在于代碼被載入的時(shí)刻不同。靜態(tài)庫(kù)的代碼在編譯過(guò)程中已經(jīng)被載入可執(zhí)行程序,因此體積較大。共享庫(kù)的代碼是在可執(zhí)行程序運(yùn)行時(shí)才載入內(nèi)存的,在編譯過(guò)程中僅簡(jiǎn)單的引用,因此代碼體積較小。??1.3庫(kù)存在的意義庫(kù)是別人寫(xiě)好的現(xiàn)有的,成熟的,可以復(fù)用的代碼,你可以使用但要記得遵

3、守許可協(xié)議?,F(xiàn)實(shí)中每個(gè)程序都要依賴很多基礎(chǔ)的底層庫(kù),不可能每個(gè)人的代碼都從零開(kāi)始,因此庫(kù)的存在意義非同尋常。共享庫(kù)的好處是,不同的應(yīng)用程序如果調(diào)用相同的庫(kù),那么在內(nèi)存里只需要有一份該共享庫(kù)的實(shí)例。??1.4庫(kù)文件是如何產(chǎn)生的在linux下靜態(tài)庫(kù)的后綴是.a,它的產(chǎn)生分兩步Step1.由源文件編譯生成一堆.o,每個(gè).o里都包含這個(gè)編譯單元的符號(hào)表Step2.ar命令將很多.o轉(zhuǎn)換成.a,成文靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)的后綴是.so,它由gcc加特定參數(shù)編譯產(chǎn)生。具體方法參見(jiàn)后文實(shí)例。?1.5庫(kù)文件是如何命名的,有沒(méi)

4、有什么規(guī)范在linux下,庫(kù)文件一般放在/usr/lib和/lib下,靜態(tài)庫(kù)的名字一般為libxxxx.a,其中xxxx是該lib的名稱動(dòng)態(tài)庫(kù)的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號(hào),minor是副版本號(hào)??1.6如何知道一個(gè)可執(zhí)行程序依賴哪些庫(kù)ldd命令可以查看一個(gè)可執(zhí)行程序依賴的共享庫(kù),例如#ldd/bin/lnlibc.so.6=>/lib/libc.so.6(0×40021000)/lib/ld-linux.so.2=>/lib

5、/ld-linux.so.2(0×40000000)可以看到ln命令依賴于libc庫(kù)和ld-linux庫(kù)??1.7可執(zhí)行程序在執(zhí)行的時(shí)候如何定位共享庫(kù)文件當(dāng)系統(tǒng)加載可執(zhí)行代碼時(shí)候,能夠知道其所依賴的庫(kù)的名字,但是還需要知道絕對(duì)路徑此時(shí)就需要系統(tǒng)動(dòng)態(tài)載入器(dynamiclinker/loader)對(duì)于elf格式的可執(zhí)行程序,是由ld-linux.so*來(lái)完成的,它先后搜索elf文件的DT_RPATH段—環(huán)境變量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/u

6、sr/lib目錄找到庫(kù)文件后將其載入內(nèi)存如:exportLD_LIBRARY_PATH=’pwd’將當(dāng)前文件目錄添加為共享目錄?1.8在新安裝一個(gè)庫(kù)之后如何讓系統(tǒng)能夠找到他如果安裝在/lib或者/usr/lib下,那么ld默認(rèn)能夠找到,無(wú)需其他操作。如果安裝在其他目錄,需要將其添加到/etc/ld.so.cache文件中,步驟如下1.編輯/etc/ld.so.conf文件,加入庫(kù)文件所在目錄的路徑2.運(yùn)行l(wèi)dconfig,該命令會(huì)重建/etc/ld.so.cache文件??二、實(shí)驗(yàn)設(shè)計(jì)我們通常把一些

7、公用函數(shù)制作成函數(shù)庫(kù),供其它程序使用。函數(shù)庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。?靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù)。?動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在。?本文主要通過(guò)舉例來(lái)說(shuō)明在Linux中如何創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),以及使用它們。?為了便于闡述,我們先做一部分準(zhǔn)備工作。?2.1準(zhǔn)備好測(cè)試代碼hello.h、hello.c和main.c;hello.h(見(jiàn)程序1)為該函數(shù)庫(kù)的頭文件。?hello.c(見(jiàn)程序2)

8、是函數(shù)庫(kù)的源程序,其中包含公用函數(shù)hello,該函數(shù)將在屏幕上輸出"HelloXXX!"。?main.c(見(jiàn)程序3)為測(cè)試庫(kù)文件的主程序,在主程序中調(diào)用了公用函數(shù)hello。??程序1:hello.h?viewplaincopytoclipboardprint?1.#ifndef?HELLO_H??2.#define?HELLO_H??3.??4.void?hello(const?char?*name);??5.??1.#endif?//HELLO_H?????程序2

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。