溫馨提示×

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

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

linux obj表示什么

發(fā)布時(shí)間:2023-04-19 09:43:10 來(lái)源:億速云 閱讀:139 作者:iii 欄目:建站服務(wù)器

本篇內(nèi)容主要講解“l(fā)inux obj表示什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“l(fā)inux obj表示什么”吧!

linux obj代表linux中的“.o”,即目標(biāo)文件,也就是相當(dāng)于windows中的“.obj”文件;obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱(chēng),所以在連接時(shí)有時(shí)會(huì)出現(xiàn)未解決的外部符號(hào)的問(wèn)題。

淺析Linux中的.a、.so、和.o文件

linux obj表示什么

前言

我們?cè)贚inux平臺(tái)進(jìn)行源碼安裝的時(shí)候,經(jīng)常會(huì)遇到.so、.o文件的輸出信息。這些文件的輸出信息我們一般來(lái)說(shuō)只需要大概看一眼,不需要深入探索。但是如果我們需要親自編寫(xiě)源碼,手動(dòng)進(jìn)行編譯的時(shí)候,就需要對(duì)這些信息進(jìn)行深度了解了。

文件解釋

在linux中這些.so、.o、.a文件,其實(shí)和Windows中的obj、lib、dll、exe等文件的關(guān)系是對(duì)應(yīng)的。在解釋linux這些文件之前,我們先來(lái)說(shuō)下windows中這些文件的作用。

windows下obj、lib、dll、exe的關(guān)系

exe是我們平常所知道的可執(zhí)行程序的后綴,而obj、lib、dll則是構(gòu)成運(yùn)行程序的關(guān)鍵文件。lib是和dll對(duì)應(yīng)的。lib是靜態(tài)鏈接庫(kù)的庫(kù)文件,dll是動(dòng)態(tài)鏈接庫(kù)的庫(kù)文件。

所謂靜態(tài)就是link的時(shí)候把里面需要的東西抽取出來(lái)安排到你的exe文件中,以后運(yùn)行你的exe的時(shí)候不再需要lib。所謂動(dòng)態(tài)就是exe運(yùn)行的時(shí)候依賴(lài)于dll里面提供的功能,沒(méi)有這個(gè)dll,你的exe無(wú)法運(yùn)行。

lib,dll,exe都算是最終的目標(biāo)文件,是最終產(chǎn)物。而c/c++屬于源代碼。源代碼和最終目標(biāo)文件中過(guò)渡的就是中間代碼obj,實(shí)際上之所以需要中間代碼,是你不可能一次得到目標(biāo)文件。

比如說(shuō)一個(gè)exe需要很多的cpp文件生成。而編譯器一次只能編譯一個(gè)cpp文件。這樣編譯器編譯好一個(gè)cpp以后會(huì)將其編譯成obj,當(dāng)所有必須要的cpp都編譯成obj以后,再統(tǒng)一link成所需要的exe,應(yīng)該說(shuō)缺少任意一個(gè)obj都會(huì)導(dǎo)致exe的鏈接失敗。

obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱(chēng),所以在連接時(shí)有時(shí)會(huì)出現(xiàn)未解決的外部符號(hào)的問(wèn)題。當(dāng)連成exe后便不存在名稱(chēng)的概念了,只有地址。lib就是一堆obj的組合。

理論上可以連接obj文件來(lái)引用其他工程(可以認(rèn)為一個(gè)obj文件等價(jià)于編譯生成它的cpp文件,可以引用obj來(lái)替換cpp,也可以添加cpp來(lái)替換obj ),但實(shí)際中通常用lib來(lái)實(shí)現(xiàn)工程間相互引用。

編譯器會(huì)默認(rèn)鏈接一些常用的庫(kù),其它的需要你自己指定。

lib和dll的區(qū)別

lib是編譯時(shí)需要的,dll是運(yùn)行時(shí)需要的。如果要完成源代碼的編譯,有l(wèi)ib就夠了。如果也使動(dòng)態(tài)連接的程序運(yùn)行起來(lái),有dll就夠了。在開(kāi)發(fā)和調(diào)試階段,當(dāng)然最好都有。

一般的動(dòng)態(tài)庫(kù)程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運(yùn)行期才會(huì)被調(diào)用的。如果有dll文件,那么對(duì)應(yīng)的lib文件一般是一些索引信息,具體的實(shí)現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個(gè)lib文件是靜態(tài)編譯出來(lái)的,索引和實(shí)現(xiàn)都在其中。

靜態(tài)編譯的lib文件有好處:給用戶(hù)安裝時(shí)就不需要再掛動(dòng)態(tài)庫(kù)了。但也有缺點(diǎn),就是導(dǎo)致應(yīng)用程序比較大,而且失去了動(dòng)態(tài)庫(kù)的靈活性,在版本升級(jí)時(shí),同時(shí)要發(fā)布新的應(yīng)用程序才行。

在動(dòng)態(tài)庫(kù)的情況下,有兩個(gè)文件,一個(gè)是引入庫(kù)(.LIB)文件(實(shí)際上也算是一個(gè)靜態(tài)庫(kù),只是在鏈接時(shí)只能把函數(shù)在dll的入口鏈接到exe中,而不像真正靜態(tài)鏈接庫(kù)那樣將函數(shù)體真正鏈接到exe中 ,通過(guò)lib進(jìn)行的動(dòng)態(tài)鏈接實(shí)際上也使用了靜態(tài)鏈接來(lái)實(shí)現(xiàn) ),一個(gè)是dll文件,引入庫(kù)文件包含被dll導(dǎo)出的函數(shù)的名稱(chēng)和位置,dll包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的dll文件,庫(kù)中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中.

因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是dll中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個(gè)或多個(gè)應(yīng)用程序運(yùn)行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來(lái),從而節(jié)省了內(nèi)存資源。從上面的說(shuō)明可以看出,dll和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)?huì)產(chǎn)生錯(cuò)誤。

dll內(nèi)的函數(shù)分為兩種:

dll導(dǎo)出函數(shù),可供應(yīng)用程序調(diào)用;

dll內(nèi)部函數(shù),只能在dll程序使用,應(yīng)用程序無(wú)法調(diào)用它們

linux下 .o、.a、.so文件的的區(qū)別

.o,是目標(biāo)文件,相當(dāng)于windows中的.obj文件。

.so 為共享庫(kù),是shared object,用于動(dòng)態(tài)連接的,相當(dāng)于windows下的dll,是Linux中的可執(zhí)行文件。

.a為靜態(tài)庫(kù),說(shuō)白了就是一堆.o合在一起,用于靜態(tài)連接,效果和.o是一樣的。

靜態(tài)函數(shù)庫(kù)

特點(diǎn):實(shí)際上是簡(jiǎn)單的普通目標(biāo)文件的集合,在程序執(zhí)行前就加入到目標(biāo)程序中。

優(yōu)點(diǎn):可以用以前某些程序兼容;描述簡(jiǎn)單;允許程序員把程序link起來(lái)而不用重新編譯代碼,也就數(shù)不需要外部函數(shù)的支持,節(jié)省了重新編譯代碼的時(shí)間(該優(yōu)勢(shì)目前已不明顯);開(kāi)發(fā)者還可以對(duì)源代碼保密。

這類(lèi)庫(kù)的名字一般是libxxx.a.利用靜態(tài)函數(shù)庫(kù)編譯成的文件比較大,因?yàn)檎麄€(gè)函數(shù)庫(kù)的所有數(shù)據(jù)都會(huì)被整合進(jìn)目標(biāo)代碼中。

缺點(diǎn):如果靜態(tài)函數(shù)庫(kù)改變了,那么你的程序必須重新編譯。

共享函數(shù)庫(kù)

共享函數(shù)庫(kù)在可執(zhí)行程序啟動(dòng)的時(shí)候加載,所有程序重新運(yùn)行時(shí)都可自動(dòng)加載共享函數(shù)庫(kù)中的函數(shù)。相對(duì)于靜態(tài)函數(shù)庫(kù),共享函數(shù)庫(kù)在編譯的時(shí)候 并沒(méi)有被編譯進(jìn)目標(biāo)代碼中。

當(dāng)程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用共享函數(shù)庫(kù)里相應(yīng)的函數(shù),因此共享函數(shù)庫(kù)所產(chǎn)生的可執(zhí)行文件比較小.由于共享函數(shù)庫(kù)沒(méi)有被整合進(jìn)你的程序,而是在程序運(yùn)行時(shí)動(dòng)態(tài)地申請(qǐng)并調(diào)用,所以程序的運(yùn)行環(huán)境中必須提供相應(yīng)的庫(kù).

共享函數(shù)庫(kù)的改變并不影響你的程序,所以共享函數(shù)庫(kù)的升級(jí)比較方便.

到此,相信大家對(duì)“l(fā)inux obj表示什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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