溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在linux中庫(kù)與頭文件的聯(lián)系是什么

發(fā)布時(shí)間:2023-03-16 10:35:24 來(lái)源:億速云 閱讀:96 作者:iii 欄目:建站服務(wù)器

本篇內(nèi)容介紹了“在linux中庫(kù)與頭文件的聯(lián)系是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在linux中庫(kù)與頭文件的聯(lián)系:頭文件中有函數(shù)的申明,庫(kù)文件實(shí)現(xiàn)函數(shù)的定義;庫(kù)中的每個(gè)函數(shù)都需要在頭文件中加以聲明。在寫(xiě)程序時(shí),需要用頭文件來(lái)提供對(duì)常量的定義和對(duì)系統(tǒng)函數(shù)及庫(kù)函數(shù)調(diào)用的聲明;而庫(kù)是一組已經(jīng)編譯好的函數(shù)的集合,也就是目標(biāo)文件“.o”的集合,是按照可重用的原則編寫(xiě)的,一般由一組互關(guān)聯(lián)的函數(shù)組成以執(zhí)行某項(xiàng)常見(jiàn)任務(wù)。

在一般應(yīng)用程序源代碼中,頭文件中有函數(shù)的申明,庫(kù)文件實(shí)現(xiàn)函數(shù)的定義;庫(kù)中的每個(gè)函數(shù)都需要在頭文件中加以聲明。

1. 頭文件

在寫(xiě)程序時(shí),我們需要用頭文件來(lái)提供對(duì)常量的定義和對(duì)系統(tǒng)函數(shù)及庫(kù)函數(shù)調(diào)用的聲明,這些頭文件位于/usr/include中。這些頭文件都位于可以被編譯器自動(dòng)搜索到的目錄中,如X視窗系統(tǒng)的/usr/include/X11和GNU C++的/usr/include /c++。

在調(diào)用gcc時(shí),可以使用標(biāo)志-I來(lái)包含保存在子目錄或其它非標(biāo)準(zhǔn)位置中的頭文件,例如 gcc -I/usr/openwin/include fred.c

2. 庫(kù)文件

庫(kù)是一組已經(jīng)編譯好的函數(shù)的集合,也就是目標(biāo)文件.o的集合,是按照可重用的原則編寫(xiě)的,一般由一組互關(guān)聯(lián)的函數(shù)組成以執(zhí)行某項(xiàng)常見(jiàn)任務(wù)。

標(biāo)準(zhǔn)linux系統(tǒng)庫(kù)文件一般存儲(chǔ)在/lib/usr/lib目錄中。默認(rèn)情況下GCC的鏈接程序只搜索標(biāo)準(zhǔn)C語(yǔ)言庫(kù),這是一個(gè)歷史遺留問(wèn)題。我們必須使庫(kù)文件名遵守特定的規(guī)范并在命令行中加以指定。

庫(kù)文件總以lib開(kāi)頭,然后指出這是什么庫(kù),最后的部分.a代表靜態(tài)函數(shù)庫(kù),.so代表共享函數(shù)庫(kù)(即windows下的DLL動(dòng)態(tài)鏈接庫(kù))。

gcc -o fred fred.c /usr/lib/libm.agcc -o fred fred.c -lm
-L標(biāo)志為鏈接器增加庫(kù)的搜索路徑,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

2.1 靜態(tài)庫(kù)

靜態(tài)庫(kù)以.a結(jié)尾,也稱作歸檔文件,在生成可執(zhí)行程序時(shí),靜態(tài)庫(kù)文件就被鏈接進(jìn)去,生成的可執(zhí)行文件較大,可以脫離靜態(tài)庫(kù)文件運(yùn)行。

2.1.1 生成方法

首先創(chuàng)建兩個(gè)源文件fred.c和bill.c

在linux中庫(kù)與頭文件的聯(lián)系是什么

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后用gcc -c編譯生成兩個(gè)目標(biāo)文件

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后為這兩個(gè)函數(shù)編寫(xiě)頭文件,進(jìn)行函數(shù)聲明

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后在main函數(shù)中包含頭文件并調(diào)用其中一個(gè)庫(kù)函數(shù)

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后編譯main函數(shù)并將main.o和之前生成的bill.o鏈接,可以正確執(zhí)行

在linux中庫(kù)與頭文件的聯(lián)系是什么

接下來(lái)我們生成庫(kù)文件,用ar歸檔程序創(chuàng)建歸檔文件并將目標(biāo)文件添加進(jìn)去,它可將若干單獨(dú)的文件歸并到一個(gè)大的文件中。ar crv libfoo.a bill.o fred.o 之后我們要用ranlib命令為函數(shù)庫(kù)生成一個(gè)內(nèi)容表。

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后我們將庫(kù)文件和之前生成的program.o文件鏈接起來(lái),執(zhí)行成功

在linux中庫(kù)與頭文件的聯(lián)系是什么

也可以用-l指定函數(shù)庫(kù),并用-L指定非標(biāo)準(zhǔn)位置。

在linux中庫(kù)與頭文件的聯(lián)系是什么

我們可以用nm命令查看哪些函數(shù)被包含在目標(biāo)文件,函數(shù)庫(kù)或可執(zhí)行文件中,可用于反匯編分析。程序被創(chuàng)建時(shí)它只包含函數(shù)庫(kù)中它所實(shí)際需要的函數(shù),雖然頭文件中有所有函數(shù)的聲明,但鏈接器并不會(huì)將它們?nèi)挎溄舆M(jìn)去。

在linux中庫(kù)與頭文件的聯(lián)系是什么

在linux中庫(kù)與頭文件的聯(lián)系是什么

靜態(tài)庫(kù)Linux與Windows的比較

在linux中庫(kù)與頭文件的聯(lián)系是什么

2.2 共享庫(kù)

當(dāng)同時(shí)運(yùn)行許多應(yīng)用程序并且他們中都使用來(lái)自同一個(gè)函數(shù)庫(kù)的函數(shù)時(shí),內(nèi)存中會(huì)有同一個(gè)函數(shù)的許多副本,浪費(fèi)內(nèi)存和外存??!當(dāng)程序使用函數(shù)庫(kù)時(shí),它本身在鏈接時(shí)不再包含函數(shù)代碼,而是引用運(yùn)行時(shí)可訪問(wèn)的共享代碼,當(dāng)編譯好的程序被裝載到內(nèi)存中執(zhí)行時(shí),函數(shù)引用被解析并產(chǎn)生對(duì)共享庫(kù)的調(diào)用,如果有必要,共享庫(kù)才被加載到內(nèi)存中。即系統(tǒng)可以只在內(nèi)存中保留共享庫(kù)的一份副本供許多應(yīng)用程序調(diào)用,在外存上也可只保留一份。而且共享庫(kù)的更新也可以獨(dú)立于依賴它的應(yīng)用程序,應(yīng)用程序不需再重新編譯。
在linux系統(tǒng)中,負(fù)責(zé)裝載共享庫(kù)并解析客戶程序引用的函數(shù)的程序(動(dòng)態(tài)裝載器)是ld.so

2.2.1 生成方法

用中間文件bill.o fred.o生成共享庫(kù)libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o

在linux中庫(kù)與頭文件的聯(lián)系是什么

生成了共享庫(kù)后,要置于標(biāo)準(zhǔn)搜索目錄下。搜索共享庫(kù)的額外位置可以在文件/etc/ld.so.conf中配置,修改這個(gè)文件后執(zhí)行命令ldconfig來(lái)處理。
/etc/ld.so.conf的內(nèi)容為include /etc/ld.so.conf.d/*.conf,在此目錄下建立自己的動(dòng)態(tài)鏈接庫(kù)路徑配置文件mylib.conf

在linux中庫(kù)與頭文件的聯(lián)系是什么

然后指定搜索路徑

在linux中庫(kù)與頭文件的聯(lián)系是什么

鏈接生成可執(zhí)行文件gcc -o main program.o -lfoo -L.

在linux中庫(kù)與頭文件的聯(lián)系是什么

ldd工具可用來(lái)分析可執(zhí)行文件運(yùn)行所需要的共享庫(kù)

在linux中庫(kù)與頭文件的聯(lián)系是什么

也可以在編譯目標(biāo)代碼時(shí)指定.so庫(kù)的搜索路徑,通過(guò)gcc 的參數(shù)-Wl,-rpath指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示后面的參數(shù)將傳給 link 程序 ld (因?yàn)?gcc 會(huì)自動(dòng)調(diào)用ld )當(dāng)指定多個(gè)動(dòng)態(tài)庫(kù)搜索路徑時(shí),路徑之間用冒號(hào) " : " 分隔。

在linux中庫(kù)與頭文件的聯(lián)系是什么

“在linux中庫(kù)與頭文件的聯(lián)系是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI