gcc編譯c語言程序

編譯:當前源代碼編譯成二進制目標文件(.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

相關文章
相關標籤/搜索