日期:2014-05-16  浏览次数:20728 次

Linux下开发环境(gcc/g++/makefile/gdb)

?

1. gcc与g++编译流程:

预处理preprocessing --> 编译compilation --> 汇编assembly --> 链接linking

举例:

[hadoop@sam1 testGCC]$ cat hello.c

?

#include<stdio.h>
int main(){
	printf("in C");
	return 0;
}
?

?

?

(0)一步到位的编译

?

[hadoop@sam1 testGCC]$ ls

hello.c

[hadoop@sam1 testGCC]$ gcc hello.c -o hello

[hadoop@sam1 testGCC]$ ./hello

in C

?

可以使用-O选项告诉GCC对源代码进行基本优化,使程序执行更快,可以替换使用如下命令:

gcc hello.c -o hello -O0 ? ? ? ? ?//没有优化

gcc hello.c -o hello -O1 ? ? ? ? ?//缺省,主要进行跳转和延迟退栈两种优化

gcc hello.c -o hello -O2 ? ? ? ? ?//除了完成-O1 的优化之外,还进行一些额外的指令调整工作

gcc hello.c -o hello -O3 ? ? ? ? ?//除了完成-O2 的优化之外,还进行包括循环展开和其他一些与处理特性相关的优化工作

?

?

(1)预处理:源文件hello.c --> 预处理文件hello.i。只激活预处理,不生成文件,需要把它重定向到一个输出文件(预处理器的输出默认被送到标准输出,而非文件中)。

[hadoop@sam1 testGCC]$ ls

hello.c

[hadoop@sam1 testGCC]$ gcc -E hello.c -o hello.i


注:

hello.c后缀为c表示: ?

?? ? ? ? C source code which must be preprocessed.


-E ?Stop after the preprocessing stage; do not run the compiler proper.?The output is in the form of preprocessed source code, which is?sent to the standard output.

?? ? Input files which don't require preprocessing are ignored.


(2)编译预处理文件hello.i --> 汇编文件hello.s。激活预处理,编译,把文件编译成汇编代码。

?

[hadoop@sam1 testGCC]$ ls

hello.c ?hello.i

[hadoop@sam1 testGCC]$ gcc -S hello.i -o hello.s


注:

hello.s:

Assembler code. 经过编译后产生了汇编代码

长这个样子:

	.file	"hello.c"
	.section	.rodata
.LC0:
	.string	"in C"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$16, %esp
	movl	$.LC0, %eax
	movl	%eax, (%esp)
	call	printf
	movl	$0, %eax
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
	.section	.note.GNU-stack,"",@progbits
??

-S ?Stop after the stage of compilation proper; do not assemble. ?The?output is in the form of an assembler code file for each non-assembler input file specified.

?? ? By default