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调试程序才能对该可执行程序进行调试。

相关文章
相关标签/搜索