码迷,mamicode.com
首页 > 其他好文 > 详细

GCC编译器入门

时间:2014-12-29 15:14:54      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

  GCC编译器(GNU C Compiler)是GNU组织的一款开源 编译器,它是Linux环境下的默认C语言编译器。它处理能够高效的编译C语言以外,还可以编译其他语言。并且,现在的GCC已经不光包括编译器本身,还包含了编译过程中的工具链。

 

1 GCC编译流程

在学习使用GCC编译程序之前,首先要知道编译C程序的基本流程,一般情况下分为下面四步:

(1) 对C语言进行预处理,生成*.i文件。

(2) 将上一步生成的*.i文件编译生成汇编语言文件,后缀名为*.s

(3) 将汇编语言文件*.s经过汇编,生成目标文件,后缀名为*.o

(4) 将各个模块的*.o文件链接起来,生成最终的可执行文件

 

2 GCC常用选项

GCC的编译选项非常多,现在有上千个,但是我们常用的并不多,下面我们只介绍其中非常实用的几个。

在这之前,我们先编写下面的几个源文件,以备测试只用。

 

技术分享
 1 //main.c
 2 #include <stdio.h>
 3 
 4 extern int add(int a, int b);
 5 extern int mul(int a, int b);
 6 
 7 int main(void)
 8 {
 9     int a = 10, b = 5;
10     int result;
11     
12     result = add(a, mul(a,  b));
13     printf("result = %d\n", result);
14     return 0;
15 }
main.c
技术分享
1 //test1.c
2 int add(int a, int b)
3 {
4     return a+b;
5 }
test1.c
技术分享
1 //test2.c
2 int mul(int a, int b)
3 {
4     return a*b;
5 }
test2.c

 

2.1 -c选项

  该选项(小写c)表示编译、汇编指定的源文件,但是不进行链接。该选项的使用方法如下:

gcc -c source.c

也就是在-c选项后面紧跟要编译、汇编的C源文件,最终生成与源文件名称相同,但是后缀为*.o结尾的目标文件。

xiaomanon@xiaomanon-machine:~/Documents/c_code$ ls
main.c  test1.c  test2.c
xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc -c test1.c
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ls
main.c  test1.c  test1.o  test2.c

可以看到,使用-c选项编译之后生成了对应的*.o目标文件。当然,你也可以一次性指定多个C源文件,使用-c选项后,会针对每一个C源文件生成一个相应的*.o目标文件。

xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc -c test2.c main.c
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ls
main.c  main.o  test1.c  test1.o  test2.c  test2.o

 

2.2 -S选项

  该选项(大写S)将C语言源文件编译生成汇编语言文件,但是并不汇编该程序。注意:汇编过程的作用是将汇编语言文件编译成目标文件*.o,而-S选项的作用是得到汇编语言文件*.s。该选项的使用方法为:

gcc -S source.c

使用该选项,最终生成与源文件名称相同,但是后缀为*.s结尾的汇编语言文件。

xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc -S test1.c
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ls
main.c  test1.c  test1.s  test2.c

当然,输入的源文件也不止一个,你可以编译当前目录下的所有C语言源文件:

xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc -S *.c
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ls
main.c  main.s  test1.c  test1.s  test2.c  test2.s

我们也可以查看生成的汇编语言代码:

技术分享
 1     .file    "test1.c"
 2     .text
 3     .globl    add
 4     .type    add, @function
 5 add:
 6 .LFB0:
 7     .cfi_startproc
 8     pushl    %ebp
 9     .cfi_def_cfa_offset 8
10     .cfi_offset 5, -8
11     movl    %esp, %ebp
12     .cfi_def_cfa_register 5
13     movl    12(%ebp), %eax
14     movl    8(%ebp), %edx
15     addl    %edx, %eax
16     popl    %ebp
17     .cfi_restore 5
18     .cfi_def_cfa 4, 4
19     ret
20     .cfi_endproc
21 .LFE0:
22     .size    add, .-add
23     .ident    "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
24     .section    .note.GNU-stack,"",@progbits
test1.s

 

GCC编译器入门

标签:

原文地址:http://www.cnblogs.com/xiaomanon/p/4191583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!