国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

創(chuàng)建和使用庫:靜態(tài)、共享和動態(tài)

2019-11-17 05:37:36
字體:
供稿:網(wǎng)友
    C語言中有一些函數(shù)不需要進行編譯,有一些函數(shù)也可以在多個文憑中使用。一般來說,這些函數(shù)都會執(zhí)行一些標準任務(wù),如數(shù)據(jù)庫輸入/輸出操作或屏幕控制等。可以事先對這些函數(shù)進行編譯,然后將它們放置在一些非凡的目標代碼文件中,這些目標代碼文件就稱為庫。庫文件中的函數(shù)可以通過連接程序與應(yīng)用程序進行連接。這樣就不必在每次開發(fā)程序時都對這些通用的函數(shù)進行編譯了。

不同類型的應(yīng)用程序?qū)褂貌煌暮瘮?shù)庫。例如:libdbm庫中組包含了對數(shù)據(jù)庫文件進行訪問的dbm函數(shù),需要對數(shù)據(jù)庫進行操作的程序就會與該庫進行連接。數(shù)學(xué)應(yīng)用程序?qū)⑹褂脭?shù)學(xué)庫libm,X-Windows應(yīng)用程序?qū)⑹褂肵lib庫,libX11。另外,所有的程序都將使用標準的C函數(shù)庫。libc,該庫中包含了諸好內(nèi)存治理或輸入輸出操作的基本函數(shù),這些庫都存放在/usr/lib這些系統(tǒng)公用的目錄中,系統(tǒ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),當然使用舊的a.out模式也可以實現(xiàn)庫的共享。linux系統(tǒng)中目前可執(zhí)行文件的標準格式為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可以是任何字符串,用來唯一標識某個庫。該字符串可以是一個單字、幾個字符、甚至一個字母。數(shù)學(xué)共享庫的庫名為libm.so.5,這里的標識字符為m,版本號為5。libm.a則是靜態(tài)數(shù)學(xué)庫。X-Windows庫名為libX11.so.6,這里使用X11作為庫的標識,版本號為6。

使用gcc編譯器就可以將庫與自己開發(fā)的程序連接起來,例如:libc.so.5中包含了標準的輸入輸出函數(shù),當連接程序進行目標代碼連接時會自動搜索該程序并將其連接到生成的可執(zhí)行文件中。標準的輸入輸出庫中包含了許多基本的輸入輸出函數(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可以在程序中連接標準算術(shù)庫,-l將首先使用libname.so進行搜索,這里是libm.so。下面的例子將使用算術(shù)庫創(chuàng)建bookrecs程序,請注重這里的-lm選項。
$ gcc main.c io.c -o bookrecs -lm

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汝南县| 调兵山市| 西平县| 昭觉县| 太康县| 甘泉县| 河津市| 新源县| 循化| 敖汉旗| 广南县| 黔江区| 新营市| 通江县| 宁乡县| 宣武区| 文安县| 游戏| 洛川县| 内江市| 安庆市| 颍上县| 视频| 神木县| 泗水县| 彰化市| 宜章县| 景谷| 兴山县| 定州市| 庆元县| 东方市| 汉源县| 南宁市| 潜江市| 云和县| 峨边| 鄂托克旗| 揭西县| 开平市| 岳池县|