乙個c**到乙個可執行程式,其中經歷了預編譯、編譯和鏈結過程,最終生成可執行程式。
1、編輯源**hello.c
#include #define hello "hello world!\n"#define test
int main(void
)
2、進行預編譯
預編譯也叫預處理,本質上就是處理帶『#』的部分和注釋,包括以下幾部分:
1)刪除所有的注釋。
2)將#include包含的標頭檔案直接拷貝到hello.c檔案中。
3)將所有的巨集定義展開,也就是把所有的巨集替換掉,並將#define刪除。例子中是將printf中的hello用"hello world!\n"進行了替換,最終是printf("hello world!\n");。
4)處理所有的條件編譯指令,#ifdef、#ifndef、#endif等。例子中的#ifdef test,在預編譯的過程中會檢查是否定義了test這個巨集,如果定義了就使用printf這個語句,如果沒有定義什麼也不做。
5)#pragma特殊的指令,用的很少。
6)新增行號和檔案標識(#error、#line)用於除錯和編譯出錯時。
//使用gcc -e hello.c -o hello.i生成預處理後的檔案
[root@localhost compile_process]# gcc -e hello.c -o hello.i
//使用ls -lh看一下檔案的大小
[root@localhost compile_process]# ls -lh
total 24k
-rw-r--r--. 1 root root 163 nov 20
11:12
hello.c
-rw-r--r--. 1 root root 17k nov 20
14:46 hello.i
3、編譯
編譯過程本質上就是把我們編寫的**翻譯成機器語言的過程,這個過程都做了以下幾步:
1)詞法分析
2)語法分析
3)語義分析
4)優化後生成相應的彙編**
//使用gcc -s hello.c -o hello.s生成彙編**
[root@localhost compile_process]# gcc -s hello.i -o hello.s
//ls -lh
[root@localhost compile_process]# ls -lh
total 28k
-rw-r--r--. 1 root root 163 nov 20
11:12
hello.c
-rw-r--r--. 1 root root 17k nov 20
14:46
hello.i
-rw-r--r--. 1 root root 347 nov 20
15:02 hello.s
//使用gcc -c hello.s -o hello.o將彙編檔案生成二進位制檔案也就是機器能識別的語言
[root@localhost compile_process]# gcc -c hello.s -o hello.o
//ls -lh
[root@localhost compile_process]# ls -lh
total 32k
-rw-r--r--. 1 root root 163 nov 20
11:12
hello.c
-rw-r--r--. 1 root root 17k nov 20
15:08
hello.i
-rw-r--r--. 1 root root 856 nov 20
15:15
hello.o
-rw-r--r--. 1 root root 347 nov 20
15:08 hello.s
4、鏈結
在編譯後只是生成了二進位制檔案,該檔案不是可執行檔案,要想得到可執行檔案就要把二進位制檔案和c標準庫綁到一起,這就是鏈結過程了。
//使用gcc hello.o -o hello生成可執行檔案hello
[root@localhost compile_process]# gcc hello.o -o hello
//ls -lh
[root@localhost compile_process]# ls -lh
total 40k
-rwxr-xr-x. 1 root root 4.6k nov 20
15:27
hello
-rw-r--r--. 1 root root 163 nov 20
11:12
hello.c
-rw-r--r--. 1 root root 17k nov 20
15:08
hello.i
-rw-r--r--. 1 root root 856 nov 20
15:15
hello.o
-rw-r--r--. 1 root root 347 nov 20
15:08
hello.s
//執行可執行檔案hello
[root@localhost compile_process]# ./hello
hello world!
//使用ldd檢視一下可執行程式所依賴的庫資訊
[root@localhost compile_process]# ldd hello
linux-gate.so.1 => (0x00ad9000
) libc.so.
6 => /lib/libc.so.6 (0x003da000
) /lib/ld-linux.so.2 (0x00572000)
C語言編譯過程
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理讀...
C語言編譯過程
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理 ...
C語言編譯過程
章 c語言編譯過程 2008年09月02日 星期二 上午 09 53 編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程...