您好,登錄后才能下訂單哦!
本篇內容主要講解“linux obj表示什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“linux obj表示什么”吧!
linux obj代表linux中的“.o”,即目標文件,也就是相當于windows中的“.obj”文件;obj里存的是編譯后的代碼跟數據,并且有名稱,所以在連接時有時會出現未解決的外部符號的問題。
淺析Linux中的.a、.so、和.o文件
前言
我們在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 obj表示什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。