日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

linux寶庫(kù)/編程技術(shù)/創(chuàng)建和使用庫(kù):靜態(tài)、共享和動(dòng)態(tài)

 todaytomo 2006-12-30
創(chuàng)建和使用庫(kù):靜態(tài)、共享和動(dòng)態(tài)
2004-04-23 15:18 pm
作者:Norkai Laboratory
來自:linux寶庫(kù) (http://www.)
現(xiàn)存:http://www./1025.html
聯(lián)系:linuxmine#gmail.com

不明白?歡迎到 linux論壇 (http://bbs.) 參加討論!

C語(yǔ)言中有一些函數(shù)不需要進(jìn)行編譯,有一些函數(shù)也可以在多個(gè)文憑中使用。一般來說,
這些函數(shù)都會(huì)執(zhí)行一些標(biāo)準(zhǔn)任務(wù),如數(shù)據(jù)庫(kù)輸入 /輸出操作或屏幕控制等??梢允孪葘?duì)這些
函數(shù)進(jìn)行編譯,然后將它們放置在一些特殊的目標(biāo)代碼文件中,這些目標(biāo)代碼文件就稱為庫(kù)。
庫(kù)文件中的函數(shù)可以通過連接程序與應(yīng)用程序進(jìn)行連接。這樣就不必在每次開發(fā)程序時(shí)都對(duì)
這些通用的函數(shù)進(jìn)行編譯了。

不同類型的應(yīng)用程序?qū)?huì)使用不同的函數(shù)庫(kù)。例如:libdbm庫(kù)中組包含了對(duì)數(shù)據(jù)庫(kù)文件
進(jìn)行訪問的dbm函數(shù),需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的程序就會(huì)與該庫(kù)進(jìn)行連接。數(shù)學(xué)應(yīng)用程序?qū)?br> 使用數(shù)學(xué)庫(kù)libm,X-Windows應(yīng)用程序?qū)⑹褂肵lib庫(kù),libX11。另外,所有的程序都將使用
標(biāo)準(zhǔn)的C函數(shù)庫(kù)。libc,該庫(kù)中包含了諸好內(nèi)存管理或輸入輸出操作的基本函數(shù),這些庫(kù)都
存放在/usr/lib這些系統(tǒng)公用的目錄中,系統(tǒng)中的任何用戶都可以利用這些庫(kù)。當(dāng)然用戶也
可以建立自己專用的庫(kù)函數(shù),供自己或其它指定的人員使用。

庫(kù)可以有三種使用的形式:靜態(tài)、共享和動(dòng)態(tài)。靜態(tài)庫(kù)的代碼在編譯時(shí)就已連接到開發(fā)
人員開發(fā)的應(yīng)用程序中,而共享庫(kù)只是在程序開始運(yùn)行時(shí)才載入,在編譯時(shí),只是簡(jiǎn)單地指
定需要使用的庫(kù)函數(shù)。動(dòng)態(tài)庫(kù)則是共享庫(kù)的另一種變化形式。動(dòng)態(tài)庫(kù)也是在程序運(yùn)行時(shí)載入,
但與共享庫(kù)不同的是,使用的庫(kù)函數(shù)不是在程序運(yùn)行開始,而是在程序中的語(yǔ)句需要使用該
函數(shù)時(shí)才載入。動(dòng)態(tài)庫(kù)可以在程序運(yùn)行期間釋放動(dòng)態(tài)庫(kù)所占用的內(nèi)存,騰出空間供其它程序
使用。由于共享庫(kù)和動(dòng)態(tài)庫(kù)并沒有在程序中包括庫(kù)函數(shù)的內(nèi)容,只是包含了對(duì)庫(kù)函數(shù)的引用,
因此代碼的規(guī)模比較小。

已經(jīng)開發(fā)的大多數(shù)庫(kù)都采取共享庫(kù)的方式。ELF格式的可執(zhí)行文件使得共享庫(kù)能夠比較容
易地實(shí)現(xiàn),當(dāng)然使用舊的a.out模式也可以實(shí)現(xiàn)庫(kù)的共享。Linux系統(tǒng)中目前可執(zhí)行文件的標(biāo)準(zhǔn)
格式為ELF格式。

GNU庫(kù)的使用必須遵守Library GNU Public License(LGPL許可協(xié)議)。該協(xié)議與GNU許可協(xié)
議略有不同,開發(fā)人員可以免費(fèi)使用GNU庫(kù)進(jìn)行軟件開發(fā),但必須保證向用戶提供所用的庫(kù)函
數(shù)的源代碼。

系統(tǒng)中可用的庫(kù)都存放在/usr/lib和/lib目錄中。庫(kù)文件名由前綴lib和庫(kù)名以及后綴組
成。根據(jù)庫(kù)的類型不同,后綴名也不一樣。共享庫(kù)的后綴名由.so和版本號(hào)組成,靜態(tài)庫(kù)的后
綴名為.a。采用舊的a.out格式的共享庫(kù)的后綴名為.sa。

libname.so.major.minor
libname.a
這里的name可以是任何字符串,用來唯一標(biāo)識(shí)某個(gè)庫(kù)。該字符串可以是一個(gè)單字、幾個(gè)字
符、甚至一個(gè)字母。數(shù)學(xué)共享庫(kù)的庫(kù)名為libm.so.5,這里的標(biāo)識(shí)字符為m,版本號(hào)為5。libm.a
則是靜態(tài)數(shù)學(xué)庫(kù)。X-Windows庫(kù)名為libX11.so.6,這里使用X11作為庫(kù)的標(biāo)識(shí),版本號(hào)為6。

使用gcc編譯器就可以將庫(kù)與自己開發(fā)的程序連接起來,例如:libc.so.5中包含了標(biāo)準(zhǔn)的輸
入輸出函數(shù),當(dāng)連接程序進(jìn)行目標(biāo)代碼連接時(shí)會(huì)自動(dòng)搜索該程序并將其連接到生成的可執(zhí)行文件
中。標(biāo)準(zhǔn)的輸入輸出庫(kù)中包含了許多基本的輸入輸出函數(shù),如printf函數(shù)等。也可以連接其它的
一些系統(tǒng)函數(shù)庫(kù),如數(shù)學(xué)庫(kù)等,但與libc.so.5不同,大部分其它的系統(tǒng)庫(kù)需要在命令行中顯式
指定所用的庫(kù)名。

在/usr/lib和/lib目錄中可以找到絕大多數(shù)的共享庫(kù)。連接時(shí)將首先搜索這兩個(gè)目錄。有一
些庫(kù)也可能存放在特定的目錄中,在/etc/ld.conf配置文件中給出了這些目錄的列表。連接程序
也會(huì)對(duì)列出的這些目錄進(jìn)行搜索。在默認(rèn)情況下,Linux將首先搜索指定庫(kù)的共享版本,如果找
不到,才會(huì)去搜索靜態(tài)版本。在對(duì)共享庫(kù)進(jìn)行更新或安裝新庫(kù)后,必須運(yùn)行l(wèi)dconfig命令更新
/etc/ld.conf文件中相應(yīng)的項(xiàng)(如果使用RPM進(jìn)行安裝,一般會(huì)自動(dòng)進(jìn)行更新,不過也不能保證
這一點(diǎn))。

在gcc編譯器中引用可搜索到的目錄中的庫(kù)文件時(shí),需要使用-l選項(xiàng)和庫(kù)名。在gcc命令行上
輸入-lm可以在程序中連接標(biāo)準(zhǔn)算術(shù)庫(kù),-l將首先使用libname.so進(jìn)行搜索,這里是libm.so。下
面的例子將使用算術(shù)庫(kù)創(chuàng)建bookrecs程序,請(qǐng)注意這里的-lm選項(xiàng)。
$ gcc main.c io.c -o bookrecs -lm

系統(tǒng)中還有一些其它可用的庫(kù),常用的是libncurses.a庫(kù),包含了一些簡(jiǎn)單的鼠標(biāo)移動(dòng)例程。
在命令行中使用-lncurses選項(xiàng)引用libncurses.so庫(kù)。下面的例子同時(shí)調(diào)用了數(shù)學(xué)和光標(biāo)庫(kù)。
$ gcc mian.c io.c -o bookrecs -lm -lncurses

在引用其它目錄中的庫(kù)時(shí),需要使用-ldir選項(xiàng)指定該目錄。該選項(xiàng)指定了搜索庫(kù)函數(shù)時(shí)其
它路徑。在下面的例子中,用戶在連接時(shí)使用了mydir目錄中的myio.so庫(kù)文件。
$ gcc main.c -o bookrecs -lmydir -lmyio (http://www.)


a的是為了支持較老的a.out格式的可執(zhí)行文件的
.so的是支持elf格式的可執(zhí)行文件的庫(kù)。

靜態(tài)庫(kù)是指編譯連接時(shí),把庫(kù)文件的代碼全部加入到可執(zhí)行文件中,所以生成的文件較大,
但運(yùn)行時(shí),就不再需要庫(kù)文件了。動(dòng)態(tài)庫(kù)正好相反,在編譯連接時(shí),沒有把庫(kù)文件的代碼加入
到可執(zhí)行文件中,所以生成的文件較小,但運(yùn)行時(shí),仍需要加載庫(kù)文件

.a是靜態(tài)庫(kù)文件,可以用ar 命令生成。
.so是動(dòng)態(tài)庫(kù)文件,編譯時(shí)加上指定的選項(xiàng)即可生成,具體選項(xiàng)看相應(yīng)的系統(tǒng)文檔了。。。。

IBM AIX下如下:
$(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL)

假設(shè)你有test1.c test2.c test3.c , 編寫成動(dòng)態(tài)鏈接庫(kù)
1. 先編譯成test1.o test2.o test3.o
2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o

我給你一篇文章吧,是IBM公司的人寫的,我就是照著里面做的,另外你可以采用C++的方
式寫,然后再套一層C寫SO,最后可供外部以C的方式調(diào)用。還有一種方法就是將C++編寫的SO
以C++的方式提供給外界使用,就是在外部程序中引入類的聲明及變量實(shí)例,就好象外部程序
也是其中一部分一樣。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多