gcc常用编译过程

   Fire想要成为一个合格的linux驱动工程师,就必须先学会在linux系统下编程,必须精通c,所以Fire就朝这这方面走。学会了c的用法后,就要想着怎么去linux下编程c代码,在linux下,我们编写c语言用到的一个很重要的工具就是gcc。那么,就让Fire带大家走进gcc吧。

  gcc的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,gcc已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 gcc也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

1 下来我们先看看这个c代码:

     //test.c

             #include <stdio.h>
             int main(void)
             {  
                printf("Hello world!\n");
                reture 0;                                           
             }

这个程序,几乎是大家学c语言都会练习的第一个程序吧。

一步到位的编译指令是:

       gcc test.c -o test(指定可执行文件的名字为test)

       gcc test.c(若没有制定可执行文件的名字,那么可执行文件默认为a.out)

实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

2.1 预处理

              gcc -E test.c > test.i             

可以输出test.i文件中存放着test.c经预处理之后的代码。看一看test.i文件,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码.

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

2.2编译为汇编代码(Compilation)

预处理之后,可直接对生成的test.i文件编译,生成汇编代码:

      gcc -S test.c -o test.s

gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o给输出汇编代码文件命名。

2.3汇编(Assembly)

对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:

       gcc -c test.s -o test.o

2.4连接(Linking)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成可执行文件test

    gcc test.o (不用-o强制名字的话,默认生成了a.out可执行文件)

   在命令行窗口中,执行./a.out, 让它说HelloWorld吧!

3 多个程序文件的编译

通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用gcc能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:

      gcc test1.c test2.c -o test

如果同时处理的文件不止一个,gcc仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:

                gcc -c test1.c -o test1.o
                gcc -c test2.c -o test2.o
                gcc test1.o test2.o -o test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值