C 編譯 執行過程中產生的各種檔案

2022-07-12 11:42:10 字數 1913 閱讀 4985

參考:

lib是和dll對應的。lib是靜態鏈結庫的庫檔案,dll是動態鏈結庫的庫檔案。

1、靜態就是link的時候把裡面需要的東西抽取出來安排到你的exe檔案中,以後執行你的exe的時候不再需要lib。

2、動態就是exe執行的時候依賴於dll裡面提供的功能,沒有這個dll,你的exe無法執行。

obj檔案時編譯成obj檔案,是中間檔案。lib,dll,exe都算是最終的目標檔案,是最終產物。而c/c++屬於源**。源**和最終目標檔案中過渡的就是中間**obj,實際上之所以需要中間**,是你不可能一次得到目標檔案。比如說乙個exe需要很多的cpp檔案生成。而編譯器一次只能編譯乙個cpp檔案。這樣編譯器編譯好乙個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統一link成所需要的exe,應該說缺少任意乙個obj都會導致exe的鏈結失敗。

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

2.理論上可以連線obj檔案來引用其他工程(可以認為乙個obj檔案等價於編譯生成它的cpp檔案,可以引用obj來替換cpp,也可以新增cpp來替換obj ),但實際中通常用lib來實現工程間相互引用。

3.編譯器會預設鏈結一些常用的庫,其它的需要你自己指定(例如gdal/opencv等)。

lib和dll的區別

(1)lib是編譯時需要的,dll是執行時需要的。如果要完成源**的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。

(2) 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。 靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。

(3)在動態庫的情況下,有兩個檔案,乙個是引入庫(.lib)檔案(實際上也算是乙個靜態庫,只是在鏈結時只能把函式在dll的入口鏈結到exe中,而不像真正靜態鏈結庫那樣將函式體真正鏈結到exe中,通過lib進行的動態鏈結實際上也使用了靜態鏈結來實現),乙個是dll檔案,引入庫檔案包含被dll匯出的函式的名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到所需要使用的dll檔案,庫中的函式和資料並不複製到可執行檔案中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式**和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.lib檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

dll內的函式分為兩種:

(1)dll匯出函式,可**用程式呼叫;

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

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

.so 為共享庫,是shared object,用於動態連線的,相當於windows下的dll;

.a為靜態庫,是好多個.o合在一起,用於靜態連線;

.o檔案是鏈結檔案,.a是靜態庫檔案,靠.o檔案生成,作為乙個庫為外部程式提供函式,介面。

生成.o檔案:

gcc -c test.o test.c

生成.a檔案:

ar cqs test.a test.o

.o 就相當於windows裡的obj檔案 ,乙個.c或.cpp檔案對應乙個.o檔案

.a 是好多個.o合在一起,用於靜態連線 ,即static mode,多個.a可以鏈結生成乙個exe的可執行檔案

.so 是shared object,用於動態連線的,和windows的dll差不多,使用時才載入。

軟體測試過程中產生的文件

軟體測試是軟體開發的乙個重要環節,同時也是軟體質量保證的乙個重要環節。所謂測試就是用已知的輸入在已知環境中動態地執行系統 或系統的部件 測試一般包括單元測試 模組測試 整合測試和系統測試。如果測試結果與預期結果不一致,則很可能是發現了系統中的錯誤,測試過程中將產生下述基本文件 1 測試計畫 確定測試...

模型訓練過程中產生NAN的原因分析

在模型的訓練過程中發現,有時在經過多輪訓練後loss會突然變為nan。loss變為nan也就使權重更新後的網路裡的引數變為了nan,這樣就使整個訓練無法再進行下去了。從除錯情況來看nan出現的順序是 loss的梯度 網路的引數 的結果 loss本身。注意,第乙個出現問題的應該是loss的梯度。一般s...

socket傳輸過程中產生的粘包拆包問題

我們在之前一篇部落格 說的是socket套接字底層資料傳輸。這篇部落格中就出現了socket傳輸過程中的粘包拆包問題。就是因為socket傳送的是無界線的資料流。所以當多個包的大小不一,並且傳送出去的時候,緩衝區的大小不一樣,會導致包與包之間和合併和包的拆分問題。對於上圖粘包 拆包問題的場景 客戶端...