gcc編譯流程及經常使用選項

1、gcc編譯流程

gcc編譯器在編譯一個C語言程序時要通過如下4步:bash

  1. 將C語言源程序預處理,生成 .i 文件。
  2. 預處理後的 .i 文件編譯成爲彙編語言,生成 .s 文件。
  3. 將彙編語言文件通過彙編,生成目標文件 .o 文件。
  4. 將各個模塊的 .o 文件連接起來生成一個可執行程序文件。

流程圖以下:ide

2、gcc經常使用選項

1.經常使用選項彙總

經常使用的編譯選項
gcc編譯選項 選項的意義
-c 編譯、彙編指定的源文件,可是不進行連接
-S 編譯指定的源文件,可是不進行彙編
-E 預處理指定的源文件,不進行編譯
-o [file1] [file2] 將文件file2編譯成可執行文件file1
-I directory 指定include包含文件的搜索目錄
-g 生成調試信息,該程序能夠被調試器調試

注意:gc編譯選項會區分大小寫。spa

1. -c 選項

-c選項表示編譯、彙編指定的源文件,可是不進行連接。使用-c選項能夠將每個源文件編譯成對應目標文件。若是不設置該選項,gcc生成的目標文件沒有.o文件,以下例子:調試

使用gcc選項表示只編譯源文件,而不進行連接,所以,對於連接中出錯的錯誤是沒法發現的。code

2. -S 選項

-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

3. -E 選項

-E選項將C語言源文件進行預處理,可是並不編譯該程序。對於通常的預處理問題,能夠只用這個選項進行查看,例如,宏的展開問題,文件的包含問題等。編譯

4. -o 選項

-o選項的格式:

-o [file1] file2

-o選項將輸入的文件編譯爲一個名爲file2的二進制可執行程序。

例如:

gcc test.c -o test

gcc接受的輸入文件不只能夠是C語言的源文件(.c文件),同時也能夠是已經編譯好的目標文件(.o文件)。

5. -I 選項

用於指定包含的頭文件的目錄,這一點對於大型的代碼組織來講頗有用的。

6. -g選項

-g 選項可生成能被gdb調試器所使用的調試信息。只有使用了該選項後生成的可執行文件,才帶有程序中引用的符號表。這時gdb調試程序才能對該可執行程序進行調試。

相關文章
相關標籤/搜索