gcc编译流程及常用选项

原创
2016/10/24 15:12
阅读数 720

一、gcc编译流程

gcc编译器在编译一个C语言程序时要经过以下4步:

  1. 将C语言源程序预处理,生成 .i 文件。
  2. 预处理后的 .i 文件编译成为汇编语言,生成 .s 文件。
  3. 将汇编语言文件经过汇编,生成目标文件 .o 文件。
  4. 将各个模块的 .o 文件链接起来生成一个可执行程序文件。

流程图如下:

二、gcc常用选项

1.常用选项汇总

常用的编译选项
gcc编译选项 选项的意义
-c 编译、汇编指定的源文件,但是不进行链接
-S 编译指定的源文件,但是不进行汇编
-E 预处理指定的源文件,不进行编译
-o [file1] [file2] 将文件file2编译成可执行文件file1
-I directory 指定include包含文件的搜索目录
-g 生成调试信息,该程序可以被调试器调试

注意:gc编译选项会区分大小写。

1. -c 选项

-c选项表示编译、汇编指定的源文件,但是不进行链接。使用-c选项可以将每一个源文件编译成对应目标文件。如果不设置该选项,gcc生成的目标文件没有.o文件,如下例子:

使用gcc选项表示只编译源文件,而不进行链接,因此,对于链接中出错的错误是无法发现的。

2. -S 选项

-S选项将C语言的源文件编译为汇编语言,但是并不汇编该语言。

例如:

#include <stdio.h>

int f(int a, int b)
{
  return a + b;
}

int main(void)
{
  int c;
  c = f(1, 2);
  return 0;
}

执行命令:

gcc -S test.c

查看生成的汇编代码:

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

 

展开阅读全文
GCC
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部