C++ 編譯過程簡介


C/C++程序編譯流程:

預處理->編譯->匯編->鏈接

具體的就是:

源代碼(source coprede)→預處理器(processor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→鏈接器(Linker)→可執行程序(executables)

C語言在linux下的基本流程如圖:

wKioL1cDsP_goUwlAAAlcbFkNbs906.png

1. 預處理

預處理相當於根據預處理指令組裝新的C/C++程序。經過預處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,這個文件的含義同原本的文件無異,只是內容上有所不同。

  • 讀取C/C++源程序,對其中的偽指令(以#開頭的指令)進行處理

    ①將所有的“#define”刪除,並且展開所有的宏定義

    ②處理所有的條件編譯指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉。 

    ③處理“#include”預編譯指令,將被包含的文件插入到該預編譯指令的位置。

(注意:這個過程可能是遞歸進行的,也就是說被包含的文件可能還包含其他文件)

  • 刪除所有的注釋

  • 添加行號和文件名標識。

    以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生的編譯錯誤或警告時能夠顯示行號

  • 保留所有的#pragma編譯器指令

2. 編譯

將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化后,產生相應的匯編代碼文件。

3. 匯編

將編譯完的匯編代碼文件翻譯成機器指令,並生成可重定位目標程序的.o文件,該文件為二進制文件,字節編碼是機器指令。

匯編器是將匯編代碼轉變成機器可以執行的指令,每一個匯編語句幾乎都對應一條機器指令。所以匯編器的匯編過程相對於編譯器來講比較簡單,它沒有復雜的語法,也沒有語義,也不需要做指令優化,只是根據匯編指令和機器指令的對照表一一翻譯即可。

4. 鏈接

通過鏈接器將一個個目標文件(或許還會有庫文件)鏈接在一起生成一個完整的可執行程序。

    由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。

將生成的.obj文件與庫文件.lib等文件鏈接,生成可執行文件(.exe文件)

例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變量或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。

    鏈接程序的主要工作就是將有關的目標文件彼此相連接,也就是將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。

 

 

 

1.dll .obj .lib使用在windows平台下

.dll:動態鏈接庫,作為共享函數庫的可執行文件
.obj:對象文件,相當於源代碼對應的二進制文件,未經重定位
.lib:可理解為多個obj的集合,本質與.obj相同

2 .so .o .a使用在linux平台下

.so:(share object)動態鏈接庫,跟Windows平台類似
.o: 對象文件,相當於源代碼對應的二進制文件
.a: 與.o類似,多個.o的集合

 

 

 

PDB

英文全稱:Program Database File

中文全稱:程序數據庫 文件

問:Debug里有pdb,Release里也有pdb,他們有什么不同呢?為什么很多人都不喜歡pdb,欲除之而后快?

答:
Debug里的PDB是full,保存着調試和項目狀態信息、有斷言、堆棧檢查等代碼。
Release 里的PDB是pdb-only,基本上:出什么錯了+錯誤在哪行。

因為很多人把PDB理解成:調試文件、Program Debug Database、會泄露代碼機密,所以想將其刪除,那只要在VS的 項目-->生成-->高級-->調試信息-->None便可

 

MSDN官方介紹:http://msdn.microsoft.com/zh-cn/library/ms241903.aspx

 

一句話: 調試程序用

詳細點(copy過來的,將就着看吧):
visual studio 調試需要pdb文件
在vs2005中新建了一個解決方案配置,但輸出的dll去不能調試
原來是vs在生成dll時沒有生成pdb文件,msdn上對pdb文件的描述是:
DBG 文件是可移植可執行 (PE) 格式文件,該文件包含 Visual Studio 調試器的 Codeview 格式的調試信息(也可能是其他格式,視 DBG 的創建方式而定)。當沒有某些代碼的源(如庫或 Windows API)時,DBG 文件允許調試。DBG 文件還允許執行 OLE RPC 調試。
DBG 文件已經由 PDB 文件替代,PDB 文件現在更常用於調試。
但是怎么生成pdb文件呢,命令行命令是/DEBUG
如何讓vs在生成dll時一並生成pdb文件,需要設置對應項目的調試信息為full或pdb-only,當設為none時就不生成pdb文件了
項目調試信息的設置位置在:項目屬性>生成>高級>調試信息 

不過這種東西知不知道無所謂,微軟做事就是這樣,用着很方便,但你一旦要研究,就會發現他生成的東西多得跟shi一樣的,看着都dan疼......

 

 

查看

   

visual studio里的文件后輟名解析。

2008-09-15 10:00

 

 

禁止Visual Studio編譯時生成.vshost.exe、.pdb等文件

項目名稱-->>右鍵-->>屬性-->>調試-->>啟用Visual Studio承載進程
把勾去掉即可

VS2005 在Release模式上實現了一些“特性”,默認會輸出.pdb(Program Debug Database) 文件。 要恢復“Release”模式的本來面目,需要對每個project的屬性進行一些設置:

 

Properties -> Build ->

1. Configuration :選為 Release

2. Advanced - > Debug Info :默認為“Full”,這就是所謂的新特性。把它設為Null,就是傳統的Release模式了,即不包含任何debug信息。當然,也可以選擇“pdb only”,不知道和“Full”有什么區別。。。。

=====================================================================

 

 

 

 

 

LINK       uses     a     PDB     to     hold     debugging     information     for     the     .EXE     file     or     .DLL     file.     The     program’s     PDB     is     both     an     output     file     and     an     input     file,     because     LINK     updates     the     PDB     when     it     rebuilds     the     program.   
    
    The     compiler     saves     state     information     from     the     first     compile     in     the     project’s     .IDB     file     (the     default     name     is     project.IDB     or     VC60.IDB     for     files     compiled     without     a     project).     The     compiler     uses     this     state     information     to     speed     subsequent     compiles.     
    
    If     the     compiler     cannot     find     the     project’s     .PDB     file     or     .IDB     file     (or     either     is     read-only),     it     cannot     incrementally     compile   

 

.clw文件記錄了類的信息,如果classView中某個類不見了,重新生成該文件就可以了,方法:刪除此文件,點擊“建立類向導”,根據提示輸入工程名稱就可以了;
.ncb文件記錄了類的提示信息,如果類的成員函數和變量的提示不見了,重新生成該文件即可,方法同上;
.aps文件記錄了資源信息,要利用現成的資源,需要修改3個文件,.rc文件,Resource.h文件和.aps文件,.aps直接刪除后,進入程序,VC會自動生成。

 

.APS:存放二進制資源的中間文件,VC把當前資源文件轉換成二進制格式,並存放在APS文件中,以加快資源裝載速度。資源輔助文件

.BMP:位圖資源文件

.BSC:瀏覽信息文件,由瀏覽信息維護工具(BSCMAKE)從原始瀏覽信息文件(.SBR)中生成,BSC文件可以用來在源代碼編輯窗口中進行快速定位。用於瀏覽項目信息的,如果用source brower的話就必須有這個文件。可以在project options里去掉Generate Browse Info File,這樣可以加快編譯進度。

.C:用C語言編寫的源代碼文件

.CLW:ClassWizard生成的用來存放類信息的文件classwizard信息文件,ini文件的格式。

.CNT:用來定義幫助文件中“Contents”的結構。

.CPP或.CXX:用C++語言編寫的源代碼文件

.CUR:光標資源文件

.DEF:模塊定義文件,供生成動態鏈接庫時使用。

.DLG
:定義對話框資源的獨立文件。這種文件對於VC工程來說並非必需,因為VC一般把對話框資源放在.RC資源定義文件中。

.DSP:VC開發環境生成的工程文件,VC4及以前版本使用MAK文件來定義工程。項目文件,文本格式。

.DSW:VC開發環境生成的WorkSpace文件,用來把多個工程組織到一個WorkSpace中。工作區文件,與.dsp差不多。

.EXP:由LIB工具從DEF文件生成的輸出文件,其中包含了函數和數據項目的輸出信息,LINK工具將使用EXP文件來創建動態鏈接庫。只有在編譯DLL時才會生成,記錄了DLL文件中的一些信息。

.H、.HPP或.HXX:用C/C++語言編寫的頭文件,通常用來定義數據類型,聲明變量、函數、結構和類。

.HLP:Windows幫助文件

.HM:在Help工程中,該文件定義了幫助文件與對話框、菜單或其它資源之間ID值的對應關系。

.HPJ:由Help Workshop生成的Help工程文件,用來控制Help文件的生成過程。

.HPG,生成幫助的文件的工程。

.ICO:圖標資源文件

.ILK:連接過程中生成的一種中間文件,只供LINK工具使用。

.INI
:配置文件

.LIB:庫文件,LINK工具將使用它來連接各種輸入庫,以便最終生成EXE文件

.LIC
:用戶許可證書文件,使用某些ActiveX控件時需要該文件

.MAK:即MAKE文件,VC4及以前版本使用的工程文件,用來指定如何建立一個工程,VC6把MAK文件轉換成DSP文件來處理。

.MAP:由LINK工具生成的一種文本文件,其中包含有被連接的程序的某些信息,例如程序中的組信息和公共符號信息等。執行文件的映像信息記錄文件

.MDP:舊版本的項目文件,相當於.dsp

.NCB:NCB是“No Compile Browser”的縮寫,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC開發環境自動生成。無編譯瀏覽文件。當自動完成功能出問題時可以刪除此文件。編譯工程后會自動生成。

.OBJ:由編譯器或匯編工具生成的目標文件,是模塊的二進制中間文件

.ODL:用對象描述語言編寫的源代碼文件,VC用它來生成TLB文件

.OLB:帶有類型庫資源的一種特殊的動態鏈接庫,也叫對象庫文件

.OPT:VC開發環境自動生成的用來存放WorkSpace中各種選項的文件。工程關於開發環境的參數文件。如工具條位置信息等。

.PBI、.PBO和.PBT
:由VC的性能分析工具PROFILE生成並使用的三種文件

.PCH:預編譯頭文件,比較大,由編譯器在建立工程時自動生成,其中存放有工程中已經編譯的部分代碼,在以后建立工程時不再重新編譯這些代碼,以便加快整個編譯過程的速度。

.PDB:程序數據庫文件,在建立工程時自動生成,其中存放程序的各種信息,用來加快調試過程的速度。記錄了程序有關的一些數據和調試信息。

.PLG:編譯信息文件,編譯時的error和warning信息文件

.RC:資源定義文件

.RC2:資源定義文件,供一些特殊情況下使用。

.REG:注冊表信息文件

.RES:二進制資源文件,資源編譯器編譯資源定義文件后即生成RES文件

.RTF:Rich Text Format(豐富文本格式)文檔,可由Word或寫字板來創建,常被用來生成Help文件

.SBR:VC編譯器為每個OBJ文件生成的原始瀏覽信息文件,瀏覽信息維護工具(BSCMAKE)將利用SBR文件來生成BSC文件

.TLB:OLE庫文件,其中存放了OLE自動化對象的數據類型、模塊和接口定義,自動化服務器通過TLB文件就能了解自動化對象的使用方法。

.WAV:聲音資源文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM