C/C++程序編譯流程:
預處理->編譯->匯編->鏈接
具體的就是:
源代碼(source coprede)→預處理器(processor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→鏈接器(Linker)→可執行程序(executables)
C語言在linux下的基本流程如圖:
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”有什么區別。。。。
=====================================================================