gcc编译器原理,多文件编程,makefile工具

人总是要成长的,痛过的人才知道,蚌贝生珠,不过始于一沙之痛。           ------《精英情人》      

        在Linux系统中,程序写完我们要进行编译,一般编译的时间都很短。但是当以后做项目的时候,仅仅改掉一个数据后编译,就可能花几个小时的时间。当代码量过大,分文件编程可以大大的缩短编译的时间,从而提高效率。             在将分文件编程之前,首先我们要了解编译器的工作步骤。

        拿gcc为例,     gcc编译分四步:     

        1、预处理;执行处理语句,删除注释(预先护理部分语句)     

        命令:gcc -E filename.c -o filename.i  此命令的作用是在gcc执行完预处理后停下,-o后面是自己为生成的文件取名。     

       2、汇编;将C语言转化成汇编语言(检查C语言的语法正确性)     

       命令:gcc -S filename.i -o filename.s  将预处理生成的文件进行处理,在汇编完成后停止。     

       3、编译;将汇编语言转换成目标文件(二进制文件)     

        命令:gcc -c filename.s -o filename.o  将汇编生成的文件转换成二进制文件。     

      4、链接;确保多个目标文件组成的程序正常运行。     

        命令:gcc filename.o -o filename  链接多个二进制文件生成目标文件。     

        当我们把一个文件拆分成多个.c文件,可以让每一个.c文件执行完第三步后停下,也就是生成多个.o文件,然后当修改某个函数时,只需要修改对应的.c文件,然后仅仅将这个.c文件再次编译生成新的.o文件,再将所有的.o文件进行链接,生成最后的执行文件。     


        当拿到一个项目首先想它的函数可以分几部分,为每一部分创建一个.c文件,同时为每一个.c文件创建.h文件,每个.c文件中包含它到的头文件声明,以及对应的函数,每个.h文件仅仅写函数声明。例如:


        这是所有的.c文件。

        其中,第一行#include"../include/menu.h"    include后面是写(""),还是写(<>),  一般由用户自己写的头文件写(""), 而系统给的标准库用(<>),二者的区别在于("")标识的头文件计算机编译时会从指定路径中查找,后面的../inlcude为路径(建议把所有的.h文件和所有的.c文件放在不同文件夹下,便于管理),如果不写,系统默认为当前文件夹。而<>标识的头文件计算机编译时会指定从/usr/include中查找。最后面menu.h是自己为之后编写的.h文件取的名字。 

    


        这是所有的.h文件。

        每个文件中只有函数声明(第一列为所有的宏定义),最上面两句和最下面一句建议不要省。这三句话有两个作用,一是可以避免重复调用,减少编译时间,二是可以防止循环调用。第一句#ifndef(#开头的都是预处理指令) 是if not define 的缩写,意思是如果没有定义,相应的第二句#define  那么就定义下列内容,最后一句#endif。    写完所有的.c和.h文件后进行编译,gcc后面要罗列所以的.c文件,这样显得非常麻烦,而且体现不出多文件编程减少编译时间的优点。      


        有一个叫makefile的工具可以完美解决这个问题。首先自己在.c文件中创建一个叫makefile的文件,然后可以写入以下语句:     

        上面的图片提供了三种方式。     

        第三列为第一种方式,1,3,5行的意思是  目标文件:依赖文件  也就是目标文件需要由哪些文件来产生。2,4,6行是对应的执行指令,需要注意的是每条指令前必须空一个Tab键的距离。这种的写法有两个缺点,1、当.c文件非常多的时候需要写的内容也非常多;2、当更换编译器的时候每条指令都需要更改,比如需要用winGW编译,那么所有的gcc指令都要更换。    

        第二列为第二种方式,这种方式解决第二个问题,但是每增一个.c文件还是要多写两条语句。    

        最后一列为第三种写法,这种方式完美解决了上述问题,需要更改的就只有前四行,具有很好的移植性。    编写完成后保存,需要编译时只需要键入make,所有的.c文件就会生成.o编译文件,最后生成执行文件,当修改其中一个.c时,它只将那个.c文件编译成新的.o文件,最后再将这个.o文件与其他.o文件链接生成新的执行文件。    

        但是如果我们想删除.o文件以及最后的目标文件,需要写gcc -rvf *.o main,显得很麻烦,make工具给我们提供了一个简单的方式,在makefile文件中写入你要执行的指令,同时为它取名,执行指令只需要make+指令名即可。例如上面的makefile文件需要执行删除操作,只需要键入:make clean                                                          QQ:1786610699      倔强的木木      2017年7月22日

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值