編譯
編譯器可以將源代碼轉(zhuǎn)換成機器語言单匣,在編譯過程中,會找出錯誤并報告谈宛。這個階段的輸入是在編輯期間產(chǎn)生的文件,常稱為源文件欢伏。
編譯器能找出程序中很多無效的和無法識別的錯誤入挣,包括結(jié)構(gòu)錯誤,例如程序的某個部分永遠不會執(zhí)行硝拧。編譯器輸出的結(jié)構(gòu)叫作對象代碼径筏,存放它們的文件叫作對象文件。在 Linux 中這些文件的擴展名通常是 .o障陶,在 Windows 下面這些文件的擴展名通常是 .obj 滋恬。如果編譯成功就會生成一個文件,它與源文件同名抱究。但擴展名為 .o 或者 .obj 恢氯。
其實我們在上一節(jié)編寫第一個 C 語言程序的時候,使用的
gcc -o 1-1 1-1.c
這條命令既包含了編譯也包含了鏈接,所以直接生成了可執(zhí)行文件 1-1 勋拟。
在 Linux 下編譯是在源代碼文件所在目錄輸入以下命令(假如源代碼文件是上節(jié)課的 1-1.c):
gcc -c 1-1.c
這時源文件所在的目錄將會生成 1-1.o 的文件勋磕。
鏈接
鏈接器將源代碼文件中由編譯器產(chǎn)生的各種對象模塊組合起來,再從 C 語言提供的程序庫中添加必要的代碼模塊敢靡,將它們組合成一個可執(zhí)行文件挂滓。鏈接器也可以檢測和報告錯誤,例如程序中引用了一個根本不存在的庫組件啸胧。鏈接一旦成功赶站,就會生成可執(zhí)行文件,在 Windows 下面可執(zhí)行文件的擴展名是 .exe纺念,在 Linux 下面贝椿,可執(zhí)行文件沒有擴展名,但它的文件類型是可執(zhí)行的陷谱。
在編譯生成 .o 文件的基礎(chǔ)上我們將會輸入以下命令(以編譯生成 1-1.o 為例):
gcc -o 1-1 1-1.o
這時 1-1.o 所在的目錄將會生成 1-1 可執(zhí)行文件烙博。
多數(shù)情況下,我們是通過
gcc -o 1-1 1-1.c
一次性完成編譯和鏈接叭首。
執(zhí)行
執(zhí)行階段就是成功完成了前述的三個過程后习勤,運行程序。但是這個階段可能會出現(xiàn)各種錯誤焙格,包括輸出錯誤,計算機什么也不做哦夷都,甚至是計算機崩潰眷唉。無論如何,都需要我們返回編輯階段囤官,檢查并修改源代碼冬阳。相信大家都還記得上一節(jié)課的執(zhí)行命令,在文件所在目錄執(zhí)行:
./可執(zhí)行文件name