編譯:當前源代碼編譯成二進制目標文件(.obj文件)
鏈接(link):將生成的.obj文件與庫文件.lib等文件鏈接,生成可執行文件(.exe文件)。
可以說.obj文件是.exe文件的前身;
1、obj裏存的是編譯後的代碼跟數據,並且有名稱,所以在連接時會出現未解決的外部符號壹說。當連成exe後便不存在名稱的概念了,只有地址。lib就是壹堆obj的組合。
編譯器會默認鏈接壹些常用的庫,其它的需要妳自己指定。
2、目標文件,壹般是程序編譯後的二進制文件,再通過鏈接器和資源文件鏈接就成可執行文件了。OBJ只給出了程序的相對地址,而可執行文件是絕對地址。CPP對應的二進制代碼格式obj,是未經重定位的!
3、編譯C 程序會產生obj 文件和exe 文件,我們都知道exe 文件是可執行文件,但obj 文件是做什麽用的呢?
查了下資料發現obj 文件和exe 文件都是二進制數據文件,其中obj 文件是COFF 格式,exe 文件時PE 格式。
那為什麽不直接讓 obj 文件作為可執行文件呢?
原來obj 文件的格式是跨平臺 的,通過link 可以將obj 鏈接為所使用系統能夠識別的格式,比如windows 系統中的exe 文件。
壹個現代編譯器的主要工作流程如下:
源程序(source code)→ 預處理器(preprocessor)→ 編譯器(compiler)→ 匯編程序(assembler)→ 目標程序(object code)→ 連接器(鏈接器,Linker)→ 可執行程序(executables)
擴展資料
C++編譯 (.obj, .lib, .dll, .exe的關系)
壹、總體介紹:
c++程序在編譯後,在目標路徑下會生成多個文件:
Debug文件夾(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可執行文件
*.ilk:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息
*.obj:是目標文件,源程序編譯後的產物
*.pch:全稱是PreCompiled Header,就是預先編譯好的頭文件
*.idb:文件保存的信息,使編譯器在重新編譯的時候只重編譯最新改動過的函數和只對最新類定義改動過的源文件進行重編譯,以提高編譯速度
*.pdb:全稱是Program DataBase,即程序數據庫文件,用來記錄調試信息
*.dsp:(全稱是Developer Studio Project)也是壹個配置文件
*.ncb:(全稱No Compile Browser)的縮寫,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC開發環境自動生成
*.plg:實際上是壹個超文本文件,可以用Internet Explorer打開,記錄了Build的過程
*.cpp:就是C++源代碼文件.
二、具體介紹:
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的組合。
2.理論上可以,但實際中通常用lib。
3.編譯器會默認鏈接壹些常用的庫,其它的需要妳自己指定。
附上lib和DLL的區別
(1)lib是編譯時需要的,dll是運行時需要的。?
如果要完成源代碼的編譯,有lib就夠了。?
如果也使動態連接的程序運行起來,有dll就夠了。?
在開發和調試階段,當然最好都有。?
(2)壹般的動態庫程序有lib文件和dll文件。
lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那麽對應的lib文件壹般是壹些索引信息,具體的實現在dll文件中。
如果只有lib文件,那麽這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。
但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。?
(3)在動態庫的情況下,有兩個文件,壹個是引入庫(.LIB)文件,壹個是DLL文件。
引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址。
這樣當壹個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。
從上面的說明可以看出,DLL和.LIB文件必須隨應用程序壹起發行,否則應用程序將會產生錯誤。