淺談.lib .dll .obj 關係&& .a .so .o關係
一、.obj .exe .dll .lib
(1).obj
- 目標文件,相當於源代碼對應的二進制文件。
- obj文件就是用.c .cpp .h文件經過編譯器編譯之後生成的目標文件。
(2).exe
- 將程序運行所需要的全部.obj文件連接起來,即形成.exe文件。
- 也就是windows下的可執行文件。
- obj只給出了程序的相對地址,而EXE是絕對地址
(3).dll
- .dll是可提供給多個程序同時使用的可執行代碼和數據(資源 )的庫
- 可簡單理解爲封裝好的.cpp,裏面裝的是函數的具體實現
- .dll是動態編譯出來的程序運行時所需要的庫,沒有.dll文件,動態編譯的程序就不能運行
(4).lib
- .lib是編譯程序時所需的,非運行時所需
- .lib分爲靜態和動態
- 靜態.lib包括了方法及其具體實現。
- 動態.lib只有方法的聲明,相當於一個h文件,是對實現部分(.dll文件)的導出部分的聲明。
- 利用靜態lib編譯出來的程序,運行時不需要.dll文件的支持。
- 利用動態lib編譯出來的程序,運行時需要.dll文件提供方法的具體實現
- 實際上:.lib文件可看做是若干個.obj文件的集合
(5)一個C/C++工程需要用到其他.c .h .cpp類庫、函數庫時,其包含的方式有如下圖的幾種方式
- 1、最直接的方式就是將該類庫的.h .cpp 直接引入到工程中,直接完全編譯
- 2、另外的方法是先將該類庫生成爲一個靜態的lib庫,引入工程時只需包含.h以及.lib文件,編譯時將所需的方法具體實現從.lib中提取到可執行文件,可執行文件可不需要其他東西的支持就可直接運行
- 3、常用的方法是將該類庫生成一個動態的lib庫,還有與之對應的.dll文件,引入工程時也只需包含.h以及.lib文件,但這個動態的.lib文件僅僅提供方法的聲明,具體的實現被打包在.dll文件中,因此運行生成的可執行文件需要.dll文件的支持