實例代碼:
/*
* hello.c - Canonical "Hello, World!" program
*/
#include
<stdio.h>
int main(void)
{
printf("Hello,Linux programming
world!\n");
return 0;
}
在命令行上鍵入以下命令編譯和運行這段程序:
$gcc hello.c -o
hello
$./hello
Hello, Linux programming
world!
第一行命令告訴gcc對源代碼hello.c進行編譯和鏈接,并使用-o參數指定創建名為hello的可見程序.第二行命令執行hello這個程序,第三行是程序的執行結果.
其實,gcc首先運行預處理程序cpp來展開hello.c中的宏并在其中插入#include文件所包含的內容:然后把預處理后的源代碼編譯成為目標代碼;最后,鏈接程序ld創建一個名為hello的二進制文件.
現在我們來通過手工操作重新創建這些步驟,以逐步執行編譯過程.第一布是運行預處理器.使用-E選項告訴gcc在預處理后停止編譯過程:
$gcc
-E hello.c -o
hello.cpp
此時查看hello.cpp會發現stdio.h的內容確實都插到文件里去了,而其他應當被預處理的標記也做了類似處理.
下一步是將hello.cpp編譯為目標代碼.可使用gcc的-c選項來完成:
$gcc
-x cpp-output -c hello.cpp -o
hello.o
-x選項告訴gcc從指定的步驟開始編譯,在本例中也就是編譯器處理后的源代碼(cpp-output).
gcc是怎么知道如何處理某種特殊類型的文件呢?它是依靠文件的擴展名來決定如何正確處理該文件的.
——————————————————————————————
擴展名
類型
.c
C語言源代碼
.C,.cc
C++語言源代碼
.i
預處理后的C源代碼
.ii
預處理后的C++源代碼
.S,.s
匯編語言源代碼
.o
編譯后的目標代碼
.a,.so
編譯后的庫代碼
———————————————————————————————
最后,鏈接目標文件,生成二進制代碼.
$gcc
hello.c -o hello