編譯:當前源代碼編譯成二進制目標文件(.obj文件)
鏈接(link):將生成的.obj文件與庫文件.lib等文件鏈接,生成可執行文件(.exe文件)。
一個現代編譯器的主要工作流程如下:
源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)
執行過程 雖然我們稱gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶
1.預處理(也稱預編譯,Preprocessing):命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。
2.編譯(Compilation):接着調用cc1進行編譯,這個階段根據輸入文件生成以.o為后綴的目標文件。
3.匯編(Assembly):匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為后綴的匯編語言源代碼文件、.s為后綴的匯編語言文件經過預編譯和匯編之后都生成以.o為后綴的目標文件。
4.鏈接(Linking):當所有的目標文件都生成之后,gcc就調用ld來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到 的庫函數也從各自所在的檔案庫中連到合適的地方。
實例:
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