久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

linux obj表示什么

181次閱讀
沒有評論

共計 2447 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容主要講解“linux obj 表示什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 表示什么”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-12發表,共計2447字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 汝南县| 陆丰市| 华坪县| 鄂州市| 杭锦后旗| 寿光市| 武清区| 堆龙德庆县| 雷山县| 伊川县| 泰宁县| 乌兰浩特市| 拉孜县| 闽清县| 察雅县| 泸西县| 江源县| 莱西市| 阳东县| 南充市| 九寨沟县| 扬州市| 马鞍山市| 蓝山县| 兰考县| 郯城县| 卢氏县| 安阳县| 仙居县| 安徽省| 苏州市| 和平区| 肥乡县| 轮台县| 永宁县| 泌阳县| 邢台县| 漳平市| 通化县| 马公市| 泰兴市|