編譯:當前源**編譯成二進位制目標檔案(.obj檔案)
乙個現代編譯器的主要工作流程如下:
源程式(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
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
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
gcc編譯C 程式
單個原始檔生成可執行程式 下面是乙個儲存在檔案 helloworld.cpp 中乙個簡單的 c 程式的 helloworld.cpp include int main int argc,char argv 程式使用定義在標頭檔案 iostream 中的 cout,向標準輸出寫入乙個簡單的字串。該 可...
gcc編譯C 程式
單個原始檔生成可執行程式 下面是乙個儲存在檔案 helloworld.cpp 中乙個簡單的 c 程式的 helloworld.cpp include int main int argc,char argv 程式使用定義在標頭檔案 iostream 中的 cout,向標準輸出寫入乙個簡單的字串。該 可...
gcc編譯C 程式
單個原始檔生成可執行程式 下面是乙個儲存在檔案 helloworld.cpp 中乙個簡單的 c 程式的 helloworld.cpp include int main int argc,char ar std cout hello,world std endl return 0 程式使用定義在標頭檔...