




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux庫(kù)詳解1 庫(kù)基本概念1.1 庫(kù)的分類 有兩種說(shuō)法,如果熟悉WIN平臺(tái)下的DLL,相信不難理解: 庫(kù)可以有三種使用的形式:靜態(tài)、共享和動(dòng)態(tài)。靜態(tài)庫(kù)的代碼在編譯時(shí)就已連接到開(kāi)發(fā)人員開(kāi)發(fā)的應(yīng)用程序中,而共享庫(kù)只是在程序開(kāi)始運(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)行開(kāi) 始,而是在程序中的語(yǔ)句需要使用該函數(shù)時(shí)才載入。動(dòng)態(tài)庫(kù)可以在程序運(yùn)行期間釋放動(dòng)態(tài)庫(kù)所占用的內(nèi)存,騰出空間供其它程序使用。由于共享庫(kù)和動(dòng)態(tài)庫(kù)并沒(méi)有在程序中包括庫(kù)函數(shù)的內(nèi)容,只是包含了對(duì)庫(kù)函數(shù)的引用,因此代碼的
2、規(guī)模比較小。 Linux下的庫(kù)文件分為共享庫(kù)和靜態(tài)庫(kù)兩大類,它們兩者的差別僅在程序執(zhí)行時(shí)所需的代碼是在運(yùn)行時(shí)動(dòng)態(tài)加載的,還是在編譯時(shí)靜態(tài)加載的。區(qū)分庫(kù)類型最好的方法是看它們的文件后綴,通常共享庫(kù)以.so(Shared Object的縮寫)結(jié)尾,靜態(tài)鏈接庫(kù)通常以.a結(jié)尾(Archive的縮寫)。在終端缺省情況下,共享庫(kù)通常為綠色,而靜態(tài)庫(kù)為黑色。 已經(jīng)開(kāi)發(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格式。 .a的是為了支持較老的a.out格式的可執(zhí)行文件的 .so的
3、是支持elf格式的可執(zhí)行文件的庫(kù)。 .a是靜態(tài)庫(kù)文件,可以用ar 命令生成。 .so是動(dòng)態(tài)庫(kù)文件,編譯時(shí)加上指定的選項(xiàng)即可生成,具體選項(xiàng)看相應(yīng)的系統(tǒng)文檔了。1.2 庫(kù)的命名規(guī)則GNU庫(kù)的使用必須遵守Library GNU Public License(LGPL許可協(xié)議)。該協(xié)議與GNU許可協(xié)議略有不同,開(kāi)發(fā)人員可以免費(fèi)使用GNU庫(kù)進(jìn)行軟件開(kāi)發(fā),但必須保證向用戶提供所用的庫(kù)函數(shù)的源代碼。庫(kù)的命名和約定:(1)所以的庫(kù)都以lib開(kāi)頭,許多開(kāi)發(fā)工具都依賴這個(gè)約定,特別是GCC,它會(huì)在-l選項(xiàng)所指定的文件名前自動(dòng)地插入lib. (2)文件名以.a(代表存檔,archive)結(jié)尾的庫(kù)都是靜態(tài)庫(kù),文件名以
4、.so(代表共享目標(biāo)文件,shared object)結(jié)尾的庫(kù)都是共享庫(kù),例如,libdl.a是一個(gè)靜態(tài)庫(kù),而libc.so是一個(gè)共享庫(kù)。采用舊的a.out格式的共享庫(kù)的后綴名為.sa。(3) 以_g和_p結(jié)尾的庫(kù),如libform_g.a和libfor_p.a,是基本庫(kù)libform的特殊版本。通常以_g結(jié)尾的庫(kù)是調(diào)試庫(kù),它們編入了特殊的符號(hào)和功能,能夠增加對(duì)采用了這個(gè)庫(kù)的應(yīng)用程序進(jìn)行調(diào)試的能力。類似地,代碼剖析(profiling)庫(kù)通常在名字后面附加_p,他們包含地代碼和符號(hào)能夠進(jìn)行復(fù)雜地代碼剖析和性能分析。如果你使用了這些庫(kù)中的某一個(gè),那么一旦完成調(diào)試或剖析工作,需要使用基本庫(kù)重新編譯
5、你的程序。庫(kù)名的一般格式為:libname.major_num.minor_num.patch_num, 例如,libgdbm.so.2.0.0, libgdbm.so是庫(kù)libname, major_num是2,minor_num和patch_num均為0.系統(tǒng)中可用的庫(kù)都存放在/usr/lib和/lib目錄中。這里的name可以是任何字符串,用來(lái)唯一標(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
6、。每個(gè)共享函數(shù)庫(kù)都有個(gè)特殊的名字,稱作“soname”。Soname名字命名必須以“l(fā)ib”作為前綴,然后是函數(shù)庫(kù)的名字,然后是“.so”,最后是版本號(hào)信息。不過(guò)有個(gè)特例,就是非常底層的C庫(kù)函數(shù)都不是以lib開(kāi)頭這樣命名的。每個(gè)共享函數(shù)庫(kù)都有一個(gè)真正的名字(“real name”),它是包含真正庫(kù)函數(shù)代碼的文件。真名有一個(gè)主版本號(hào),和一個(gè)發(fā)行版本號(hào)。最后一個(gè)發(fā)行版本號(hào)是可選的,可以沒(méi)有。主版本號(hào)和發(fā)行版本號(hào)使你可以知道你到底是安裝了什么版本的庫(kù)函數(shù)。另外,還有一個(gè)名字是編譯器編譯的時(shí)候需要的函數(shù)庫(kù)的名字,這個(gè)名字就是簡(jiǎn)單的soname名字,而不包含任何版本號(hào)信息。管理共享函數(shù)庫(kù)的關(guān)鍵是區(qū)分好這
7、些名字。當(dāng)可執(zhí)行程序需要在自己的程序中列出這些他們需要的共享庫(kù)函數(shù)的時(shí)候,它只要用soname就可以了;反過(guò)來(lái),當(dāng)你要?jiǎng)?chuàng)建一個(gè)新的共享函數(shù)庫(kù)的時(shí)候,你要指定一個(gè)特定的文件名,其中包含很細(xì)節(jié)的版本信息。當(dāng)你安裝一個(gè)新版本的函數(shù)庫(kù)的時(shí)候,你只要先將這些函數(shù)庫(kù)文件拷貝到一些特定的目錄中,運(yùn)行l(wèi)dconfig這個(gè)實(shí)用就可以。Ldconfig檢查已經(jīng)存在的庫(kù)文件,然后創(chuàng)建soname的符號(hào)鏈接到真正的函數(shù)庫(kù),同時(shí)設(shè)置/etc/ld.so.cache這個(gè)緩沖文件。這個(gè)我們稍后再討論。Ldconfig并不設(shè)置鏈接的名字,通常的做法是在安裝過(guò)程中完成這個(gè)鏈接名字的建立,一般來(lái)說(shuō)這個(gè)符號(hào)鏈接就簡(jiǎn)單的指向最新的s
8、oname或者最新版本的函數(shù)庫(kù)文件。最好把這個(gè)符號(hào)鏈接指向soname,因?yàn)橥ǔ.?dāng)你升級(jí)你的庫(kù)函數(shù)后,你就可以自動(dòng)使用新版本的函數(shù)庫(kù)。我們來(lái)舉例看看:/usr/lib/libreadline.so.3 是一個(gè)完全的完整的soname,ldconfig可以設(shè)置一個(gè)符號(hào)鏈接到其他某個(gè)真正的函數(shù)庫(kù)文件,例如是 /usr/lib/libreadline.so.3.0。同時(shí)還必須有一個(gè)鏈接名字,例如/usr/lib/libreadline.so 就是一個(gè)符號(hào)鏈接指向/usr/lib/libreadline.so.3。2 庫(kù)操作命令 Linux庫(kù)操作可以使用命令完成,目前常用的命令是ldd和ldconfi
9、g。2.1 ldd ldd是Library Dependency Display縮寫,它的作用是顯示一個(gè)可執(zhí)行程序必須使用的共享庫(kù)。 $ ldd /usr/bin/mesg libc.so.6 = /lib/tls/i686/cmov/libc.so.6 (0xb7eaf000) /lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0xb7feb000)2.2 ldconfig 庫(kù)安裝到系統(tǒng)以后,為了讓動(dòng)態(tài)鏈接庫(kù)為系統(tǒng)所認(rèn)識(shí)及共享,就需要運(yùn)行l(wèi)dconfig。ldconfig命令的用途,主要是在默認(rèn)搜尋目錄(/lib和 /usr/lib)以及動(dòng)態(tài)庫(kù)配置文件/etc
10、/ld.so.conf內(nèi)所列的目錄下,搜索出可共享的動(dòng)態(tài)鏈接庫(kù)(格式如lib*.so*),進(jìn)而創(chuàng)建出動(dòng)態(tài)裝入程序(ld.so)所需的連接和緩存文件。緩存文件默認(rèn)為/etc/ld.so.cache,此文件保存已排好序的動(dòng)態(tài)鏈接庫(kù)名字列表, ldconfig通常在系統(tǒng)啟動(dòng)時(shí)運(yùn)行,而當(dāng)用戶安裝了一個(gè)新的動(dòng)態(tài)鏈接庫(kù)時(shí),就需要手工運(yùn)行這個(gè)命令。(1)命令格式 ldconfig 選項(xiàng) libs(2)主要選項(xiàng) -v或-verbose ldconfig將顯示正在掃描的目錄、搜索到的動(dòng)態(tài)鏈接庫(kù),以及它所創(chuàng)建的連接的名字。 -f CONF 指定動(dòng)態(tài)鏈接庫(kù)的配置文件為CONF,系統(tǒng)默認(rèn)為/etc/ld.so.con
11、f。 -C CACHE 指定生成的緩存文件為CACHE,系統(tǒng)默認(rèn)的是/etc/ld.so.cache,文件存放已排好序的可共享的動(dòng)態(tài)鏈接庫(kù)的列表。 -p或-print-cache 讓ldconfig打印出當(dāng)前緩存文件所保存的所有共享庫(kù)的名字。 -r ROOT 改變應(yīng)用程序的根目錄為ROOT。 n ldconfig僅掃描命令行指定的目錄,不掃描默認(rèn)目錄(/lib、/usr/lib),也不掃描配置文件/etc/ld.so.conf所列的目錄。 運(yùn)行沒(méi)有選項(xiàng)的ldconfig命令時(shí),用于更新高速緩沖文件。這個(gè)命令主要用于高速緩沖DNS服務(wù)器(Caching DNS Server)。高速緩沖DNS服務(wù)
12、器的原理是提供查詢的歷史記錄,并且利用這些記錄來(lái)提高查詢的效率。當(dāng)某個(gè)查詢是第一次被發(fā)送到高速緩沖DNS服務(wù)器時(shí),高速緩沖DNS服務(wù)器就將此查詢的整個(gè)過(guò)程記錄下來(lái),在一定的時(shí)期內(nèi)用它來(lái)回答所有相同的查詢,從而減少整個(gè)DNS系統(tǒng)的負(fù)擔(dān)并且提高查詢速度。3 庫(kù)的路徑問(wèn)題為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫(kù),有三種方法:(1)把庫(kù)拷貝到/usr/lib和/lib目錄下。(2)在LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑。例如動(dòng)態(tài)庫(kù)libhello.so在/home/ting/lib目錄下,以bash為例,使用命令:$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
13、/home/ting/lib(3) 修改/etc/ld.so.conf文件,把庫(kù)所在的路徑加到文件末尾,并執(zhí)行l(wèi)dconfig刷新。這樣,加入的目錄下的所有庫(kù)文件都可見(jiàn)4 查看庫(kù)中的符號(hào)有時(shí)候可能需要查看一個(gè)庫(kù)中到底有哪些函數(shù),nm命令可以打印出庫(kù)中的涉及到的所有符號(hào)。庫(kù)既可以是靜態(tài)的也可以是動(dòng)態(tài)的。nm列出的符號(hào)有很多,常見(jiàn)的有三種,一種是在庫(kù)中被調(diào)用,但并沒(méi)有在庫(kù)中定義(表明需要其他庫(kù)支持),用U表示;一種是庫(kù)中定義的函數(shù),用T表示,這是最常見(jiàn)的;另外一種是所謂的 “弱態(tài)”符號(hào),它們雖然在庫(kù)中被定義,但是可能被其他庫(kù)中的同名符號(hào)覆蓋,用W表示。例如,假設(shè)開(kāi)發(fā)者希望知道上文提到的hello庫(kù)
14、中是否定義了 printf():$nm libhello.so |grep printfU printfU表示符號(hào)printf被引用,但是并沒(méi)有在函數(shù)內(nèi)定義,由此可以推斷,要正常使用hello庫(kù),必須有其它庫(kù)支持,再使用ldd命令查看hello依賴于哪些庫(kù):$ldd hellolibc.so.6=/lib/libc.so.6(0x400la000)/lib/ld-linux.so.2=/lib/ld-linux.so.2 (0x40000000)從上面的結(jié)果可以繼續(xù)查看printf最終在哪里被定義,有興趣可以go on5 庫(kù)升級(jí)Linux系統(tǒng)軟件更新很快,新的核心幾乎每幾個(gè)星期就公布一次,其它
15、軟件的更新也是非常頻繁。多數(shù)情況下,盲目跟隨潮流的升級(jí)并不必要,如果確實(shí)需要新版本的特性時(shí)再升級(jí)。換句話說(shuō),不要為了升級(jí)而升級(jí)。Linux系統(tǒng)中多數(shù)軟件都是用共享庫(kù)來(lái)編譯的,其中包含了在不同程序之間共享的公用子例程。在運(yùn)行某個(gè)程序時(shí),如果看到如下信息:“Incompatible library version”則表明需要將該庫(kù)升級(jí)到程序所需要的版本。庫(kù)是向下兼容的,也就是說(shuō),用老版本庫(kù)編譯的程序可以在新安裝的版本庫(kù)上運(yùn)行,反之則不行。Linux庫(kù)函數(shù)的升級(jí)是一項(xiàng)重要的工作,往往與其它軟件包的升級(jí)有一定關(guān)聯(lián)作用,所以操作前一定要備份文件。下面看一下如何把Glibc 2.2.4.13升級(jí)至2.3.
16、2版本,其過(guò)程如下: 1.下載.gz壓縮文件并解壓在GUN C網(wǎng)站下載的四個(gè).gz壓縮文件,解壓至一臨時(shí)目錄中:cd /usr/caolinuxtar xzvf glibc-2.3.2.tar.gzcd glibc-2.3.2tar xzvf ./glibc-linuxthreads-2.3.2.tar.gztar xzvf ./glibc-crypt-2.3.2.tar.gztar xzvf ./glibc-localedata-2.3.2.tar.gz 2.建立庫(kù)函數(shù)的安裝目錄mkdir /usr/higlibccd /usr/higlibc 3.建立編譯目錄mkdir caocd cao
17、./configure -enable-add-ons=linuxthreads,crypt,localedata -prefix=/usr/higlibc 4.編譯與安裝makemake checkmake install 5.改變數(shù)據(jù)庫(kù)的鏈接ln -s /usr/higlibc/lib/ld-linux.so.2 /lib/ld-linux.so.2然后,修改/etc/ld.so.conf,加入一行/usr/higlibc/lib,執(zhí)行下面代碼:ldconfig -v更新/etc/ld.so.cache的內(nèi)容,列出每個(gè)庫(kù)的版本號(hào),掃描目錄和所要?jiǎng)?chuàng)建及更新的鏈接。 6.更改GCC設(shè)置cd /
18、usr/lib/gcc-libcp -r i386-redhat-linux higlibc 7.更新符號(hào)鏈接cd /usr/higlibc/includeln -s /usr/src/linux/include/linuxln -s /usr/src/linux/include/asmln -s /usr/X11R6/include/X118.測(cè)試并完成6 高級(jí)共享庫(kù)特性6.1 soname為了在同一系統(tǒng)中使用不同版本的庫(kù),可以在庫(kù)文件名后加上版本號(hào)為后綴,例如: libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名。所以為了使用這些庫(kù),通常使用建立符號(hào)連接的方式。ln -s
19、 libhello.so.1.0 libhello.so.1ln -s libhello.so.1 libhello.so共享庫(kù)的一個(gè)非常重要的,也是非常難的概念是 soname簡(jiǎn)寫共享目標(biāo)名(short for shared object name)。這是一個(gè)為共享庫(kù)(.so)文件而內(nèi)嵌在控制數(shù)據(jù)中的名字。如前面提到的,每一個(gè)程序都有一個(gè)需要使用的庫(kù)的清單。這個(gè)清單的內(nèi)容是一系列庫(kù)的 soname,如同 ldd 顯示的那樣,共享庫(kù)裝載器必須找到這個(gè)清單。soname 的關(guān)鍵功能是它提供了兼容性的標(biāo)準(zhǔn)。當(dāng)要升級(jí)系統(tǒng)中的一個(gè)庫(kù)時(shí),并且新庫(kù)的 soname 和老的庫(kù)的 soname 一樣,用舊庫(kù)連
20、接生成的程序,使用新的庫(kù)依然能正常運(yùn)行。這個(gè)特性使得在 Linux 下,升級(jí)使用共享庫(kù)的程序和定位錯(cuò)誤變得十分容易。在 Linux 中,應(yīng)用程序通過(guò)使用 soname,來(lái)指定所希望庫(kù)的版本。庫(kù)作者也可以通過(guò)保留或者改變 soname 來(lái)聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫(kù)版本沖突問(wèn)題的困擾。查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫(kù)文件之間的關(guān)系6.2 共享庫(kù)裝載器當(dāng)程序被調(diào)用的時(shí)候,Linux 共享庫(kù)裝載器(也被稱為動(dòng)態(tài)連接器)也自動(dòng)被調(diào)用。它的作用是保證程序所需要的所有適當(dāng)版本的庫(kù)都被調(diào)入內(nèi)存。共享庫(kù)裝載器名字是 ld.so 或者是 ld-lin
21、ux.so,這取決于 Linux libc 的版本,它必須使用一點(diǎn)外部交互,才能完成自己的工作。然而它接受在環(huán)境變量和配置文件中的配置信息。文件 /etc/ld.so.conf 定義了標(biāo)準(zhǔn)系統(tǒng)庫(kù)的路徑。共享庫(kù)裝載器把它作為搜索路徑。為了改變這個(gè)設(shè)置,必須以 root 身份運(yùn)行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個(gè)文件其實(shí)是裝載器內(nèi)部使用的文件之一。6.3 使用 dlopen另外一個(gè)強(qiáng)大的庫(kù)函數(shù)是 dlopen()。該函數(shù)將打開(kāi)一個(gè)新庫(kù),并把它裝入內(nèi)存。該函數(shù)主要用來(lái)加載庫(kù)中的符號(hào),這些符號(hào)在編譯的時(shí)候是不知道的。比如 Apache Web 服務(wù)器利用這
22、個(gè)函數(shù)在運(yùn)行過(guò)程中加載模塊,這為它提供了額外的能力。一個(gè)配置文件控制了加載模塊的過(guò)程。這種機(jī)制使得在系統(tǒng)中添加或者刪除一個(gè)模塊時(shí),都不需要重新編譯了??梢栽谧约旱某绦蛑惺褂?dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫(kù)中實(shí)現(xiàn)。它需要兩個(gè)參數(shù):一個(gè)文件名和一個(gè)標(biāo)志。文件名可以是我們學(xué)習(xí)過(guò)的庫(kù)中的 soname。標(biāo)志指明是否立刻計(jì)算庫(kù)的依賴性。如果設(shè)置為 RTLD_NOW 的話,則立刻計(jì)算;如果設(shè)置的是 RTLD_LAZY,則在需要的時(shí)候才計(jì)算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫(kù)可以獲得其中的符號(hào)。當(dāng)庫(kù)被裝入后,可以把 dlopen
23、() 返回的句柄作為給 dlsym() 的第一個(gè)參數(shù),以獲得符號(hào)在庫(kù)中的地址。使用這個(gè)地址,就可以獲得庫(kù)中特定函數(shù)的指針,并且調(diào)用裝載庫(kù)中的相應(yīng)函數(shù)。7 動(dòng)態(tài)庫(kù)的編寫和使用現(xiàn)在假設(shè)有一個(gè)叫hello的程序開(kāi)發(fā)包,它提供一個(gè)靜態(tài)庫(kù)libhello.a 一個(gè)動(dòng)態(tài)庫(kù)libhello.so,一個(gè)頭文件hello.h,頭文件中提供sayhello()這個(gè)函數(shù)/* hello.h */void sayhello();另外還有一些說(shuō)明文檔。這是一個(gè)典型的程序開(kāi)發(fā)包結(jié)構(gòu)。7.1 生成庫(kù)第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼為例,生成上面用到的hello庫(kù):/* hello.c */#include vo
24、id sayhello()printf(hello,worldn);用gcc編繹該文件,在編繹時(shí)可以使用任何合法的編繹參數(shù),例如-g加入調(diào)試代碼等:gcc -c hello.c -o hello.o1.連接成靜態(tài)庫(kù)連接成靜態(tài)庫(kù)使用ar命令,其實(shí)ar是archive的意思$ar cqs libhello.a hello.o2.連接成動(dòng)態(tài)庫(kù)生成動(dòng)態(tài)庫(kù)用gcc來(lái)完成,由于可能存在多個(gè)版本,因此通常指定版本號(hào):$gcc -shared -Wl, -soname, libhello.so.1 -o libhello.so.1.0 hello.o另外再建立兩個(gè)符號(hào)連接:$ln -s libhello.so
25、.1.0 libhello.so.1$ln -s libhello.so.1 libhello.so這樣一個(gè)libhello的動(dòng)態(tài)連接庫(kù)就生成了。最重要的是傳gcc -shared 參數(shù)使其生成是動(dòng)態(tài)庫(kù)而不是普通執(zhí)行程序。-Wl 表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理。實(shí)際上,每一個(gè)庫(kù)都有一個(gè)soname,當(dāng)連接器發(fā)現(xiàn)它正在查找的程序庫(kù)中有這樣一個(gè)名稱,連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,在程序執(zhí)行期間,程序會(huì)查找擁有 soname名字的文件,而不是庫(kù)的文件名,換句話說(shuō),soname是庫(kù)的區(qū)分標(biāo)志。這
26、樣做的目的主要是允許系統(tǒng)中多個(gè)版本的庫(kù)文件共存,習(xí)慣上在命名庫(kù)文件的時(shí)候通常與soname相同:libxxxx.so.major.minor 其中,xxxx是庫(kù)的名字,major是主版本號(hào),minor 是次版本號(hào)。7.2 使用庫(kù)當(dāng)要使用靜態(tài)的程序庫(kù)時(shí),連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態(tài)程序庫(kù)也就不再需要了。 然而,對(duì)動(dòng)態(tài)庫(kù)而言,就不是這樣。動(dòng)態(tài)庫(kù)會(huì)在執(zhí)行程序內(nèi)留下一個(gè)標(biāo)記指明當(dāng)程序執(zhí)行時(shí),首先必須載入這個(gè)庫(kù)。由于動(dòng)態(tài)庫(kù)節(jié)省空間,linux下進(jìn)行連接 的缺省操作是首先連接動(dòng)態(tài)庫(kù),也就是說(shuō),如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫(kù),不特別指定的話,將
27、與動(dòng)態(tài)庫(kù)相連接。1.與動(dòng)態(tài)庫(kù)連接linux默認(rèn)的就是與動(dòng)態(tài)庫(kù)連接,下面這段程序testlib.c使用hello庫(kù)中的sayhello()函數(shù)/*testlib.c*/#include #include int main()sayhello();return 0;使用如下命令進(jìn)行編譯$gcc -c testlib.c -o testlib.o用如下命令連接:$gcc testlib.o -lhello -o testlib在連接時(shí)要注意,假設(shè)libhello.o 和libhello.a都在缺省的庫(kù)搜索路徑下/usr/lib,如果在其它位置要加上-L參數(shù)2. 與靜態(tài)庫(kù)連接與靜態(tài)庫(kù)連接麻煩一些,主要是參數(shù)問(wèn)題。還是上面的例子:$gc
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 14617-1:2025 EN Graphical symbols for diagrams - Part 1: General rules
- 2025年制動(dòng)總泵項(xiàng)目合作計(jì)劃書
- 第12課《認(rèn)識(shí)地球的形狀》教學(xué)設(shè)計(jì)-2023-2024學(xué)年人教版科學(xué)四年級(jí)下冊(cè)
- 2025年數(shù)據(jù)策略咨詢項(xiàng)目發(fā)展計(jì)劃
- 小蝌蚪的成長(zhǎng)(教學(xué)設(shè)計(jì))-2023-2024學(xué)年數(shù)學(xué)二年級(jí)下冊(cè)北師大版
- 電流互感器二次側(cè)開(kāi)路檢測(cè)算法代碼
- 醫(yī)院文化活動(dòng)與員工參與情況分析計(jì)劃
- 2024秋七年級(jí)英語(yǔ)上冊(cè) Unit 7 Days and Months Lesson 41 Holidays教學(xué)實(shí)錄 (新版)冀教版
- 小班班級(jí)的興趣特長(zhǎng)教育安排計(jì)劃
- 評(píng)估工作成果的標(biāo)準(zhǔn)化流程計(jì)劃
- 美容行業(yè):美容師簡(jiǎn)歷
- 2025年上半年安徽明光市事業(yè)單位招聘筆試易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 內(nèi)蒙古機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)为?dú)招生(機(jī)電類)考試題(附答案)
- 人教版(2024)七下 第二單元第1課《精彩瞬間》課件-七年級(jí)美術(shù)下冊(cè)(人教版)
- 六分鐘步行試驗(yàn)記錄表
- DLT_5210.1-2012_電力建設(shè)施工質(zhì)量驗(yàn)收及評(píng)價(jià)規(guī)程_第1部分土建工程__配套表格
- 《創(chuàng)新創(chuàng)業(yè)教育基礎(chǔ)》課程教學(xué)大綱3篇
- 紫微斗數(shù)筆記Word版
- 輸液泵、微量泵的使用PPT參考幻燈片
- 從內(nèi)部控制歷史看內(nèi)部控制發(fā)展
- 20以內(nèi)進(jìn)位加退位減綜合100題-10套
評(píng)論
0/150
提交評(píng)論