C語言編譯過程

2022-07-22 18:00:27 字數 2948 閱讀 1935

乙個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 編譯程...