首頁 > 運維 > linux運維 > linux obj代表什麼

linux obj代表什麼

藏色散人
發布: 2023-04-17 09:38:08
原創
2200 人瀏覽過

linux obj代表linux中的“.o”,即目標文件,也就是相當於windows中的“.obj”文件;obj裡存的是編譯後的代碼跟數據,並且有名稱,所以在連接時有時會出現未解決的外部符號的問題。

linux obj代表什麼

本教學操作環境:linux5.9.8系統、Dell G3電腦。

linux obj代表什麼?

淺析Linux中的.a、.so、和.o檔

linux obj代表什麼

前言

我們在Linux平台進行原始碼安裝的時候,常常會遇到.so、.o檔案的輸出訊息。這些文件的輸出資訊我們一般來說只需要大概看一眼,不需要深入探索。但是如果我們需要親自編寫原始碼,手動進行編譯的時候,就需要對這些資訊進行深度了解了。

文件解釋

在linux中這些.so、.o、.a文件,其實和Windows中的obj、lib、dll、exe等文件的關係是對應的。在解釋linux這些文件之前,我們先來說下windows中這些文件的作用。

windows下obj、lib、dll、exe的關係

exe是我們平常所知道的執行程式的後綴,而obj、lib、dll則是構成執行程式的關鍵文件。 lib是和dll對應的。 lib是靜態連結函式庫的函式庫文件,dll是動態連結函式庫的函式庫檔。

所謂靜態就是link的時候把裡面需要的東西抽出來安排到你的exe檔中,以後執行你的exe的時候不再需要lib。所謂動態就是exe運作的時候依賴dll裡面提供的功能,沒有這個dll,你的exe無法運作。

lib,dll,exe都算是最終的目標文件,是最終產物。而c/c 屬於原始碼。在原始碼和最終目標檔案中過渡的就是中間程式碼obj,實際上之所以需要中間程式碼,是你不可能一次得到目標檔案。

比如說一個exe需要很多的cpp檔生成。而編譯器一次只能編譯一個cpp檔。這樣編譯器編譯好一個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統一link成所需要的exe,應該說缺少任一個obj都會導致exe的連結失敗。

obj裡存的是編譯後的程式碼跟數據,並且有名稱,所以在連接時有時會出現未解決的外部符號的問題。當連成exe後便不存在名稱的概念了,只有位址。 lib就是一堆obj的組合。

理論上可以連接obj檔來引用其他工程(可以認為一個obj檔等價於編譯生成它的cpp檔,可以引用obj來替換cpp,也可以加cpp來取代obj ),但實際中通常用lib來實作工程間相互引用。

編譯器會預設連結一些常用的函式庫,其它的需要你自己指定。

lib和dll的差別

lib是編譯時需要的,dll是執行階段所需的。如果要完成原始碼的編譯,有lib就夠了。如果也讓動態連線的程式運作起來,有dll就夠了。在開發和調試階段,當然最好都有。

一般的動態函式庫程式有lib檔和dll檔。 lib檔案是必須在編譯期就連接到應用程式中的,而dll檔案是運行期才會被呼叫的。如果有dll文件,那麼對應的lib文件一般是一些索引訊息,具體的實作在dll文件中。如果只有lib文件,那麼這個lib檔是靜態編譯出來的,索引和實作都在其中。

靜態編譯的lib檔有好處:給使用者安裝時就不需要再掛動態函式庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態函式庫的彈性,在版本升級時,同時要發布新的應用程式才行。

在動態函式庫的情況下,有兩個文件,一個是引入函式庫(.LIB)文件(其實也算是一個靜態函式庫,只是在連結時只能把函數在dll的入口連結到exe中,而不像真正靜態鏈接庫那樣將函數體真正鏈接到exe中,通過lib進行的動態鏈接實際上也使用了靜態鏈接來實現),一個是dll文件,引入庫文件包含被dll導出的函數的名稱和位置,dll包含實際的函數和數據,應用程式使用LIB文件連結到所需要使用的dll文件,庫中的函數和數據並不複製到可執行文件中.

因此在應用程式的可執行檔中,存放的不是被呼叫的函數程式碼,而是dll中所要呼叫的函數的記憶體位址,這樣當一個或多個應用程式執行是再把程式碼和被呼叫的函數程式碼連結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.LIB檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

dll內的函數分為兩種:

dll導出函數,可供應用程式呼叫;

dll內部函數,只能在dll程式使用,應用程式無法呼叫它們

linux下.o、.a、.so檔案的區別

.o,是目標檔案,相當於windows中的.obj檔案。

.so 為共享庫,是shared object,用於動態連接的,相當於windows下的dll,是Linux中的可執行檔。

.a為靜態函式庫,說白了就是一堆.o合在一起,用於靜態連接,效果和.o是一樣的。

靜態函數庫

特點:實際上是簡單的普通目標檔案的集合,在程式執行前就加入目標程式。

優點:可以用以前某些程式相容;描述簡單;允許程式設計師把程式link起來而不用重新編譯程式碼,也就數不需要外部函數的支持,節省了重新編譯程式碼的時間(該優勢目前已不明顯);開發者也可以對原始碼保密。

這類庫的名字一般是libxxx.a.利用靜態函式庫編譯成的檔比較大,因為整個函式庫的所有資料都會被整合進目標碼。

缺點:如果靜態函式庫改變了,那麼你的程式必須重新編譯。

共享函數庫

共享函數庫在可執行程式啟動的時候加載,所有程式重新運行時都會自動加載共享函數庫中的函數。相對於靜態函數庫,共享函數庫在編譯的時候 並沒有被編譯進目標程式碼中。

當程式執行到相關函數時才呼叫共享函數庫裡對應的函數,因此共享函數庫所產生的可執行檔比較小.由於共享函數庫沒有被整合進你的程式,而是在程式運行時動態地申請並調用,所以程式的運行環境中必須提供相應的庫.

共享函數庫的改變並不影響你的程式,所以共享函數庫的升級比較方便.

相關推薦:《Linux影片教學

#

以上是linux obj代表什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板