C++從編譯到生成可執(zhí)行文件的流程

流程概況:將源代碼轉(zhuǎn)換成機(jī)器可識(shí)別代碼的過程,編譯程序讀取源代碼,對(duì)他進(jìn)行詞法和語法的分析,將高級(jí)語言轉(zhuǎn)化為功能等效的匯編代碼,然后轉(zhuǎn)化為機(jī)器語言,按照操作系統(tǒng)對(duì)可執(zhí)行文件格式的要求連接生成可執(zhí)行程序

源程序->編譯預(yù)處理->編譯->優(yōu)化程序->匯編程序->鏈接程序->可執(zhí)行文件

編譯預(yù)處理
讀取源代碼,對(duì)其中的偽指令(#開頭)和特殊符號(hào)進(jìn)行處理.

  • 宏定義
    #define Name TokenString :將所有Name替換成TokenString
    #undef: 取消宏定義
  • 條件編譯
    #ifdef,#ifudef,#else,#elif,endif等等
    這些偽指令讓程序員通過不同的宏決定編譯程序?qū)δ切┐a進(jìn)行處理,從而把不必要的代碼過濾掉
  • 頭文件包含指令
    #include "FileName",#include <FileName>
    1. 頭文件中有大量的宏定義,還有外部符號(hào)的聲明
      采用頭文件的目的是讓某些定義供不同的 C 源程序使用,因?yàn)橹灰由弦粭l#include,就可以把這些定義和聲明加入到對(duì)應(yīng)的源程序文件中.
    2. 系統(tǒng)提供的頭文件一般放在/usr/include下,需要使用<>來包含他們,而開發(fā)人員自己的頭文件一般在同一目錄下,此時(shí)要用""
  • 特殊符號(hào)
    預(yù)編譯可以處理一些特殊符號(hào),比如LINE是當(dāng)前的行號(hào)(十進(jìn)制),FILE是當(dāng)前源程序的名稱.預(yù)編譯會(huì)識(shí)別這些特殊符號(hào).

總結(jié):這個(gè)階段主要是對(duì)源程序的"替換"工作,替換后,上面的四個(gè)東西就消失了,得到一個(gè)沒有上述特性的輸出文件.

編譯階段
在預(yù)處理之后,編譯通過詞法和語法分析,將輸出文件翻譯陳等價(jià)的中間代碼或者匯編代碼.

優(yōu)化階段
比較復(fù)雜, 比如刪除公共表達(dá)式, 循環(huán)優(yōu)化, 無用賦值的刪除等等.
優(yōu)化階段放在編譯之后,是一種比較籠統(tǒng)的表達(dá)

匯編過程
把匯編翻譯成目標(biāo)機(jī)器指令,每一個(gè) C 語言源程序都會(huì)得到目標(biāo)文件
目標(biāo)文件由段組成:

  • 代碼段:程序本身
  • 數(shù)據(jù)段

鏈接程序
上面的目標(biāo)文件不能立即被執(zhí)行,還有一些問題, 比如,某個(gè)源程序中的函數(shù)引用了另一個(gè)源文件中的符號(hào), 調(diào)用了其他庫中的函數(shù),這些問題需要鏈接來實(shí)現(xiàn).
鏈接的主要工作就是將有關(guān)的目標(biāo)文件彼此鏈接,使得所有目標(biāo)文件成為一個(gè)統(tǒng)一整體.

  • 靜態(tài)鏈接: 函數(shù)代碼從所在的靜態(tài)鏈接庫中被拷貝到最終可執(zhí)行程序中,在執(zhí)行的時(shí)候這些代碼被裝入這個(gè)進(jìn)程的虛擬地址空間中

靜態(tài)鏈接庫:目標(biāo)文件的集合,每個(gè)文件含有庫中一個(gè)或者一組相關(guān)函數(shù)的代碼

  • 動(dòng)態(tài)鏈接: 這種方式下,函數(shù)的代碼被放在動(dòng)態(tài)鏈接庫或者共享對(duì)象的某個(gè)目標(biāo)文件中,鏈接只是在最終的可執(zhí)行程序中,記錄下共享對(duì)象的名字和一些登記信息,執(zhí)行的時(shí)候,動(dòng)態(tài)鏈接庫中的全部?jī)?nèi)容被映射到相應(yīng)進(jìn)程的虛地址空間,動(dòng)態(tài)鏈接程序通過可執(zhí)行程序中的信息找到相應(yīng)的代碼.

動(dòng)態(tài)鏈接能讓程序更加短小,多個(gè)進(jìn)程共享對(duì)象的時(shí)候能節(jié)省內(nèi)存,但是某些情況下可能會(huì)有性能的損傷

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末握础,一起剝皮案震驚了整個(gè)濱河市辐董,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禀综,老刑警劉巖简烘,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異定枷,居然都是意外死亡孤澎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門欠窒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來覆旭,“玉大人,你說我怎么就攤上這事岖妄⌒徒” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵荐虐,是天一觀的道長(zhǎng)七兜。 經(jīng)常有香客問我,道長(zhǎng)福扬,這世上最難降的妖魔是什么腕铸? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任惜犀,我火速辦了婚禮,結(jié)果婚禮上狠裹,老公的妹妹穿的比我還像新娘虽界。我一直安慰自己,他們只是感情好涛菠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布莉御。 她就那樣靜靜地躺著,像睡著了一般碗暗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梢夯,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天言疗,我揣著相機(jī)與錄音,去河邊找鬼颂砸。 笑死噪奄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的人乓。 我是一名探鬼主播勤篮,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼色罚!你這毒婦竟也來了碰缔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戳护,失蹤者是張志新(化名)和其女友劉穎金抡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌且,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梗肝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺董。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫击。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖精续,靈堂內(nèi)的尸體忽然破棺而出坝锰,到底是詐尸還是另有隱情,我是刑警寧澤重付,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布什黑,位于F島的核電站,受9級(jí)特大地震影響堪夭,放射性物質(zhì)發(fā)生泄漏愕把。R本人自食惡果不足惜拣凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨豁。 院中可真熱鬧嚣镜,春花似錦翼雀、人聲如沸赊琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢士。三九已至概作,卻和暖如春亡哄,著一層夾襖步出監(jiān)牢的瞬間叫倍,已是汗流浹背象颖。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工佩厚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人说订。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓抄瓦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親陶冷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钙姊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容