小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

假設(shè)你有test1.c test2.c test3.c , 編寫成動態(tài)鏈接庫
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++的方式提供給外界使用,就是在外部程序中引入類的聲明及變量實例,就好象外部程序
也是其中一部分一樣。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多