hello world 程序的生成過程 一個c / c ++文件需要經(jīng)過預(yù)先(預(yù)處理),編譯(編譯),編譯(匯編)和鏈接(鏈接)等四步,才能生成可執(zhí)行程序。 在日常編譯中,通常“編譯”統(tǒng)稱這四步:
預(yù)處理
預(yù)先用于將所有的#include頭文件以及宏定義替換成其真正的內(nèi)容,預(yù)先之后得到的仍然是文本文件,但文件體積會大很多。 部分截圖如下: 編譯
將通過預(yù)處理之后的程序轉(zhuǎn)換成特定的匯編代碼(匯編代碼)的過程:根據(jù).i文件編譯得到匯流編碼文件hello.s 匯編
匯編過程將上一步的匯編代碼轉(zhuǎn)換成機器碼(機器代碼),這一步產(chǎn)生的文件稱為目標(biāo)文件,是二進制格式。gcc匯編過程通過as命令完成或者通過-c選項 鏈接鏈接過程將多個目標(biāo)文(.o)以及所需的庫文件(.a或.so等)鏈接成最終的插入文件(可執(zhí)行文件)
最終可以看到一個hello world的生成過程包含許多中間過程,進行預(yù)處理,編譯,編譯和鏈接。而我們?nèi)粘J褂胓cc hello.c之間生成a.out忽略了許多中間環(huán)境。 總結(jié)本文以gcc為例,通過hello world應(yīng)用程序,簡單介紹了一個c / c ++應(yīng)用的生成過程,旨在幫助構(gòu)建加深理解,日常使用ide開發(fā)實際上屏蔽了很多細(xì)節(jié),很多集成開發(fā)環(huán)境自動配置編譯環(huán)境,開發(fā)者無需了解這些細(xì)節(jié),不過當(dāng)需要自己通過Makefie組織項目編譯時,始終繞不開這些基本知識。 ----------------------------------------------------------------------------------------------- 這么一個程序: #include <stdio.h> int main() { printf("Hello world!\n"); return 0; } 1.預(yù)處理 cpp hello.c - o hello.i 2.編譯 gcc -E hello.i -o hello.s 2.匯編器 as hello.s -o hello.o 2.鏈接器 ld -e main -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o (鏈接出來的程序“helloworld”能夠打印出來,但是會有段錯誤,目前只能用 gcc hello.o -o hello來鏈接) 這個過程看似無用,但是是在寫裸機代碼時候包括u-boot的時候沒有操作系統(tǒng)的運行就必須自己運行一步步編譯。 今天總結(jié)的過程不算是完善的,下次還要再細(xì)化一下。
|
|