多文件目录下的makefile的编写(从简单到复杂)

  • Post author:
  • Post category:其他



再看这篇文章之前可以先看下这篇文章:


Makefile文件的简单编写


为了方便管理程序文件,我们一般会添加文件夹来进行分类管理,这时候为了方便我们编译,就需要在各个文件夹里面添加一个makefile文件,make后就会自动的帮我们编译生成可执行文件。




一.简单篇




1. 先给出目录结构


bin、id、include、info、main、obj这5个文件夹在主目录航班系统里,而id文件夹下又有id_link、id_manege这两个文件夹,info有info_link、info_manege这两个文件夹。每个文件夹下都有makefile文件(include文件夹不需要makefile)。


a.

bin文件夹存放最后生成的可执行文件app;


b.

obj文件夹存放临时生成的可重定位文件(.o文件);


c.

include文件夹存放编写程序的头文件






2. 过程思路



a.

先去执行id_link、id_manage、info_link、info_manege和main这5个文件夹下的makefile,将汇编生成的可重定位文件(.o)放到obj文件夹下。


b.

在去执行obj文件夹下的makefile,将obj文件夹下的.o文件链接成可执行文件app(名称可以随便起),将这个可执行文件放到bin文件夹下,最后把obj文件夹下的.o文件删除。




3. 要用到的命令



a.

用法:make [选项]

选项: -C DIR

–directory=DIR

在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行这个DIR目录里面的makefile文件。存在多个“-C”选项时, make的最终工作目录是每一个目录将是前一个相对路径。例如:“make –C / -C etc”等价于“make –C /etc”(也就是先进入/的根目录,然后在进入根目录下的etc文件夹)。被用在递归地make调用中。


b.

“;“和”&&” 连接符:用于连接两个命令

用法:比如在当前目录下创建一个文件和显示当前目录下的文件属性,可以写成

touch filename

&&

ls -l






4. 建立并编写makefile



a.

在id_link、id_manage、info_link、info_manege、main这五个文件夹下建立makefile


(1).

id_link文件夹下的makefile内容:





(2).

id_manage文件夹下的makefile内容:




(3).

info_link文件夹下的makefile内容:




(4).

info_manege文件夹下的makefile内容:




(5).

main文件夹下的makefile内容:




说明:这五个makefile的实现功能是一样的,都是将当前目录下对应名称的.c文件汇编成对应的.o文件到obj文件夹中。



b.

在id、info这两个个文件夹下建立makefile


(1).

id文件夹下的makefile内容:





(2).

info文件夹下的makefile内容:




说明:这两个makefile的实现功能是一样的,都是先执行前一个文件夹里的makefile,在执行后一个文件夹的里的makefile。这里的ECHO是第一个规则的依赖,在没有构建ECHO依赖前先去构建依赖ECHO,然后再去生成all目标。其实第二条规则可以不用写,可以把第二条的命令

@echo “在info文件夹中”

放到第一条规则的命令里去。这样写是因为可以更直观的去表示什么是依赖。但这里需要注意的是,在当前目录下不能有ECHO文件,因为在makefile里面是把目标和依赖当成文件的,除非将ECHO声明成伪目标。



c.

在obj文件夹下建立makefile





说明:这个makefile实现的功能是,将当前目录下的.o文件链接成可执行文件app,将可执行文件放到bin文件夹里,然后将在其他makefile中make生成的.o文件删除。



d.

在主文件夹(航班系统)下建立makefile





说明:这个makefile实现的功能是,从左到右依次进入id、info、main、obj这四个文件夹下去执行make命令。注意obj是要放在末尾,这样在其他文件make后生成.o文件后,在将这些.o文件链接起来。




5. 在主目录中执行make命令





说明:执行make命令后,按顺序去“递归“的执行每个文件夹里的makefile”




6. 流程示意图






7. 优缺点



a.

优点:因为没用到变量和函数,所以能够直观的看出多文件make的原理是怎样的。




b.

缺点:实际项目中不会去这样编写,一个文件夹不止一个.c文件,而是会有多个.c文件在一个文件夹中。在生成可执行文件后把.o文件都删除了,如果工程比较小,重新将.c文件汇编成.o文件后到最后去链接,这个过程是很快的,但是如果工程量很大,然后又把生成的.o文件都全部删除,这样编译的过程就会很慢,影响项目的进度。也就是,在汇编的过程中make管理器回去检查目标与以来的时间戳,如果依赖比目标新,就会重新去汇编,否则就不会去执行汇编命令,这对于只是修改一些文件和建立新文件是有好处的,能让你编译时间减少(除非你想要clean工程)。




待续



版权声明:本文为u013581207原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。