gcc編譯器在編譯一個C語言程序時要通過如下4步:bash
流程圖以下:ide
gcc編譯選項 | 選項的意義 |
-c | 編譯、彙編指定的源文件,可是不進行連接 |
-S | 編譯指定的源文件,可是不進行彙編 |
-E | 預處理指定的源文件,不進行編譯 |
-o [file1] [file2] | 將文件file2編譯成可執行文件file1 |
-I directory | 指定include包含文件的搜索目錄 |
-g | 生成調試信息,該程序能夠被調試器調試 |
注意:gc編譯選項會區分大小寫。spa
-c選項表示編譯、彙編指定的源文件,可是不進行連接。使用-c選項能夠將每個源文件編譯成對應目標文件。若是不設置該選項,gcc生成的目標文件沒有.o文件,以下例子:調試
使用gcc選項表示只編譯源文件,而不進行連接,所以,對於連接中出錯的錯誤是沒法發現的。code
-S選項將C語言的源文件編譯爲彙編語言,可是並不彙編該語言。ci
例如:編譯器
#include <stdio.h> int f(int a, int b) { return a + b; } int main(void) { int c; c = f(1, 2); return 0; }
執行命令:it
gcc -S test.c
查看生成的彙編代碼:io
.file "test3.c" .text .globl f .type f, @function f: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movl %esi, -8(%rbp) movl -4(%rbp), %edx movl -8(%rbp), %eax addl %edx, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size f, .-f .globl main .type main, @function main: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl $2, %esi movl $1, %edi call f movl %eax, -4(%rbp) movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1: .size main, .-main .ident "GCC: (Debian 5.3.1-19) 5.3.1 20160509" .section .note.GNU-stack,"",@progbits
-E選項將C語言源文件進行預處理,可是並不編譯該程序。對於通常的預處理問題,能夠只用這個選項進行查看,例如,宏的展開問題,文件的包含問題等。編譯
-o選項的格式:
-o [file1] file2
-o選項將輸入的文件編譯爲一個名爲file2的二進制可執行程序。
例如:
gcc test.c -o test
gcc接受的輸入文件不只能夠是C語言的源文件(.c文件),同時也能夠是已經編譯好的目標文件(.o文件)。
用於指定包含的頭文件的目錄,這一點對於大型的代碼組織來講頗有用的。
-g 選項可生成能被gdb調試器所使用的調試信息。只有使用了該選項後生成的可執行文件,才帶有程序中引用的符號表。這時gdb調試程序才能對該可執行程序進行調試。