一、編譯過程
使用gcc編譯程序時,編譯過程可被細分為四個階段:
(1)預處理
(2)編譯
(3)匯編
(4)鏈接
例如hello.c程序
hello.c:
#include <stdio.h>
int main(void)
{
printf (Hello world!\n);
return 0;
}
1、預處理:
預處理階段,編譯器將代碼中的stdio.h的代碼編譯進來,用戶使用-E選項進行查看
gccc -E hello.c -o hello.i
2、編譯:
gcc首先檢查語法的規范性以及是否有語法錯誤等,以確定代碼實際要做的工作,在檢查無誤後,gcc把代碼編譯成匯編語言。
gcc -S hello.i -o hello.s
3、匯編
把編譯生成的.s文件轉換成目標文件
gcc -c hello.s -o hello.o
4、鏈接
在該階段,在這裡涉及一個重要的概念:函數庫。在這個程序中並沒有定義“printf"的函數實現,在預編譯中包含進的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那麼,是在哪裡實現“printf"函數的呢?
最後的答案是:系統把這些函數實現都己經被放入名為libc. so.6的庫文件中去了,在沒有特別指定時庫函數中去,GCC會到系統默認的搜索路徑“/usr/Iib”下進行查找,也就是鏈接到libc.so.6這樣就能實現函數“printf"了,而這也就是鏈接的作用。
Gcc hello.o –o hello