① 緙栬瘧紼嬪簭鐨勬渶緇堢洰鏍囨槸錛堛銆錛夈
銆愮瓟妗堛戱細C
C銆愯В鏋愩戠紪璇戠▼搴忎篃鍙鐩涔辯紪璇戠郴緇燂紝鏄鎶婄敤楂樼駭璇璦緙栧啓鐨勯潰鍚戣繃紼嬬殑婧愮▼搴忛珮瀛濈炕璇戞垚鐩鏍囩▼搴忕殑璇鎴氬垯紼胯█澶勭悊紼嬪簭銆
② c++ obj文件與exe文件的區別
編譯:當前源代碼編譯成二進制目標文件(.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)
(2)編譯程序中的最終目標擴展閱讀
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文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。
③ 用高級語言編寫的源程序,經編譯後產生的是
目標程序。
目標程序,又稱為「目的程序」,為源程序經編譯可直接被計算機運行的機器碼集合,在計算機文件上以.obj作擴展名----由語言處理程序(匯編程序,編譯程序,解釋程序)將源程序處理(匯編,編譯,解釋)成與之等價的由機器碼構成的,計算機能夠直接運行的程序,該程序叫目標程序。
目標代碼盡管已經是機器指令,但是還不能運行,因為目標程序還沒有解決函數調用問題,需要將各個目標程序與庫函數連接,才能形成完整的可執行程序。
(3)編譯程序中的最終目標擴展閱讀
計算機並不能直接地接受和執行用高級語言編寫的源程序,源程序在輸入計算機時,通過"翻譯程序"翻譯成機器語言形式的目標程序,計算機才能識別和執行。這種"翻譯"通常有兩種方式,即編譯方式和解釋方式。
編譯方式是指利用事先編好的一個稱為編譯程序的機器語言程序,作為系統軟體存放在計算機內,當用戶將高級語言編寫的源程序輸入計算機後,編譯程序便把源程序整個地翻譯成用機器語言表示的與之等價的目標程序。
然後計算機再執行該目標程序,以完成源程序要處理的運算並取得結果。解釋方式是指源程序進入計算機後,解釋程序邊掃描邊解釋,逐句輸入逐句翻譯。
計算機一句句執行,並不產生目標程序。如PASCAL、FORTRAN、COBOL等高級語言執行編譯方式;BASIC語言則以執行解釋方式為主;而PASCAL、C語言是能書寫編譯程序的高級程序設計語言。
④ 編譯是將整個源程序代碼文件一次性翻譯成目標程序代碼,最終生成可執行文件,對么
正確。
編譯(compilation , compile)
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
⑤ 緙栬瘧紼嬪簭鐨勬渶緇堢洰鏍囨槸錛 錛夈
銆愮瓟妗堣京鍏勩戱細C
緙栬瘧鏂瑰紡鏄鎶婇珮綰ц璦紼嬪簭鍏ㄩ儴杞鎹㈡垚鏈哄櫒鎸囦護騫朵駭鐢熺洰鏍囩(妗ョ▼搴忥紝鍐嶇敱璁$畻 鏈烘墽琛岀瀻鐏剁寷錛屾晠鏈棰橀 C 閫夐」銆
⑥ 程序設計的基本過程是怎樣的
從分析需求開始
⑦ 編譯程序的最終目標是 ______
prg編譯後是FXP。。。。只能在foxpro環境里運行。
工程編譯後是EXE。。。。windows下可執行文件
這就是為什麼!
⑧ 編譯程序的最終目標是什麼
將源程序編譯成目標程序