gcc編譯c語言程序


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM