編譯:當前源代碼編譯成二進制目標文件(.obj文件) c++
連接(link):將生成的.obj文件與庫文件.lib等文件連接,生成可執行文件(.exe文件)。 編程
一個現代編譯器的主要工做流程以下: ubuntu
源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→彙編程序(assembler)→目標程序(object code)→鏈接器(連接器,Linker)→可執行程序(executables) 函數
執行過程 雖然咱們稱gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不單單是編譯的過程,而是要經歷四個相互關聯的步驟∶ spa
1.預處理(也稱預編譯,Preprocessing):命令gcc首先調用cpp進行預處理,在預處理過程當中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。 code
2.編譯(Compilation):接着調用cc1進行編譯,這個階段根據輸入文件生成以.o爲後綴的目標文件。 編譯器
3.彙編(Assembly):彙編過程是針對彙編語言的步驟,調用as進行工做,通常來說,.S爲後綴的彙編語言源代碼文件、.s爲後綴的彙編語言文件通過預編譯和彙編以後都生成以.o爲後綴的目標文件。 工作流
4.連接(Linking):當全部的目標文件都生成以後,gcc就調用ld來完成最後的關鍵性工做,這個階段就是鏈接。在鏈接階段,全部的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到 的庫函數也從各自所在的檔案庫中連到合適的地方。 io
實例: 編譯
1.編寫.c文件以下:
#include <stdio.h>
int main()
{
printf("This is my first c program in ubuntu");
return 0;
}
2.預編譯過程:
gcc -E ./hello.c -o hello.i //.i 爲後綴的文件,是已經預處理過的C源代碼文件,能夠省略這一步。
cat hellp.c | wc -l //查看hello.c文件內容的行數。
cat hellp.i | wc -l //查看hello.i文件內容的行數。
3.彙編過程:
gcc -S hello.i -o hello.s //.s爲後綴的文件,是彙編語言源代碼文件;能夠省略這一步。
4.編譯過程
gcc -c ./hello.c //在當前文件夾下生成hello.o .o爲後綴的文件,是編譯後的目標文件;
gcc -c hello.c -o hello.o //在當前文件夾下生成hello.o
5.連接過程:
gcc hello.o -o hello
6.直接把hello文件拖動到終端便可執行。
用g++編譯c++源程序
用g++編譯c++源程序和c語言相似,可將gcc改成g++逐個嘗試。如下只提供一些簡單介紹:
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o Place the output into