本篇內(nèi)容主要講解“l(fā)inux obj表示什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“l(fā)inux obj表示什么”吧!
成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設計、成都網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務江安,十年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
linux obj代表linux中的“.o”,即目標文件,也就是相當于windows中的“.obj”文件;obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱,所以在連接時有時會出現(xiàn)未解決的外部符號的問題。
淺析Linux中的.a、.so、和.o文件
前言
我們在Linux平臺進行源碼安裝的時候,經(jīng)常會遇到.so、.o文件的輸出信息。這些文件的輸出信息我們一般來說只需要大概看一眼,不需要深入探索。但是如果我們需要親自編寫源碼,手動進行編譯的時候,就需要對這些信息進行深度了解了。
文件解釋
在linux中這些.so、.o、.a文件,其實和Windows中的obj、lib、dll、exe等文件的關系是對應的。在解釋linux這些文件之前,我們先來說下windows中這些文件的作用。
windows下obj、lib、dll、exe的關系
exe是我們平常所知道的可執(zhí)行程序的后綴,而obj、lib、dll則是構成運行程序的關鍵文件。lib是和dll對應的。lib是靜態(tài)鏈接庫的庫文件,dll是動態(tài)鏈接庫的庫文件。
所謂靜態(tài)就是link的時候把里面需要的東西抽取出來安排到你的exe文件中,以后運行你的exe的時候不再需要lib。所謂動態(tài)就是exe運行的時候依賴于dll里面提供的功能,沒有這個dll,你的exe無法運行。
lib,dll,exe都算是最終的目標文件,是最終產(chǎn)物。而c/c++屬于源代碼。源代碼和最終目標文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目標文件。
比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。這樣編譯器編譯好一個cpp以后會將其編譯成obj,當所有必須要的cpp都編譯成obj以后,再統(tǒng)一link成所需要的exe,應該說缺少任意一個obj都會導致exe的鏈接失敗。
obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱,所以在連接時有時會出現(xiàn)未解決的外部符號的問題。當連成exe后便不存在名稱的概念了,只有地址。lib就是一堆obj的組合。
理論上可以連接obj文件來引用其他工程(可以認為一個obj文件等價于編譯生成它的cpp文件,可以引用obj來替換cpp,也可以添加cpp來替換obj ),但實際中通常用lib來實現(xiàn)工程間相互引用。
編譯器會默認鏈接一些常用的庫,其它的需要你自己指定。
lib和dll的區(qū)別
lib是編譯時需要的,dll是運行時需要的。如果要完成源代碼的編譯,有l(wèi)ib就夠了。如果也使動態(tài)連接的程序運行起來,有dll就夠了。在開發(fā)和調(diào)試階段,當然最好都有。
一般的動態(tài)庫程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調(diào)用的。如果有dll文件,那么對應的lib文件一般是一些索引信息,具體的實現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實現(xiàn)都在其中。
靜態(tài)編譯的lib文件有好處:給用戶安裝時就不需要再掛動態(tài)庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態(tài)庫的靈活性,在版本升級時,同時要發(fā)布新的應用程序才行。
在動態(tài)庫的情況下,有兩個文件,一個是引入庫(.LIB)文件(實際上也算是一個靜態(tài)庫,只是在鏈接時只能把函數(shù)在dll的入口鏈接到exe中,而不像真正靜態(tài)鏈接庫那樣將函數(shù)體真正鏈接到exe中 ,通過lib進行的動態(tài)鏈接實際上也使用了靜態(tài)鏈接來實現(xiàn) ),一個是dll文件,引入庫文件包含被dll導出的函數(shù)的名稱和位置,dll包含實際的函數(shù)和數(shù)據(jù),應用程序使用LIB文件鏈接到所需要使用的dll文件,庫中的函數(shù)和數(shù)據(jù)并不復制到可執(zhí)行文件中.
因此在應用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是dll中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,dll和.LIB文件必須隨應用程序一起發(fā)行,否則應用程序?qū)a(chǎn)生錯誤。
dll內(nèi)的函數(shù)分為兩種:
dll導出函數(shù),可供應用程序調(diào)用;
dll內(nèi)部函數(shù),只能在dll程序使用,應用程序無法調(diào)用它們
linux下 .o、.a、.so文件的的區(qū)別
.o,是目標文件,相當于windows中的.obj文件。
.so 為共享庫,是shared object,用于動態(tài)連接的,相當于windows下的dll,是Linux中的可執(zhí)行文件。
.a為靜態(tài)庫,說白了就是一堆.o合在一起,用于靜態(tài)連接,效果和.o是一樣的。
靜態(tài)函數(shù)庫
特點:實際上是簡單的普通目標文件的集合,在程序執(zhí)行前就加入到目標程序中。
優(yōu)點:可以用以前某些程序兼容;描述簡單;允許程序員把程序link起來而不用重新編譯代碼,也就數(shù)不需要外部函數(shù)的支持,節(jié)省了重新編譯代碼的時間(該優(yōu)勢目前已不明顯);開發(fā)者還可以對源代碼保密。
這類庫的名字一般是libxxx.a.利用靜態(tài)函數(shù)庫編譯成的文件比較大,因為整個函數(shù)庫的所有數(shù)據(jù)都會被整合進目標代碼中。
缺點:如果靜態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。
共享函數(shù)庫
共享函數(shù)庫在可執(zhí)行程序啟動的時候加載,所有程序重新運行時都可自動加載共享函數(shù)庫中的函數(shù)。相對于靜態(tài)函數(shù)庫,共享函數(shù)庫在編譯的時候 并沒有被編譯進目標代碼中。
當程序執(zhí)行到相關函數(shù)時才調(diào)用共享函數(shù)庫里相應的函數(shù),因此共享函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小.由于共享函數(shù)庫沒有被整合進你的程序,而是在程序運行時動態(tài)地申請并調(diào)用,所以程序的運行環(huán)境中必須提供相應的庫.
共享函數(shù)庫的改變并不影響你的程序,所以共享函數(shù)庫的升級比較方便.
到此,相信大家對“l(fā)inux obj表示什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!