make命令和makefile文件
1. makefile的语法
2. make命令的选项和参数
3. makefile文件中的注释
4. makefile文件中的宏
5. 多个目标
6. 内置规则
7. 后缀和模式规则
8. 用make管理库函数
9. 高级主题:makefile文件和子目录
10.GUN make和gcc
9.makefile文件和子目录
对于大型的项目,我们希望把构成一个函数库的几个文件从主文件中分离出来,并将它们保存到一个子目录中。使用make命令完成这一工作的方法有两个:
第一个方法是,你可以在子目录中编写出第二个makefile文件,它的作用是编译该子目录下的源文件,并将它们保存到一个函数库中,然后将该库文件复制到上一级的主目录中。在主目录中的makefile文件包含一条用于制作函数库的规则,该规则会调用第二个makefile文件,如下所示:
mylib.a:
(cd mylibdirectory;$(MAKE))
这就是说,你必须总是执行命令make mylib.a。当make命令调用这条规则来创建函数库时,它将切换到子目录mylibdirectory中,然后调用一个新的make命令来管理函数库。由于make会针对每个命令调用一个新的shell,而使用第二个makefile文件的make命令本身又并没有执行cd命令,但它又必须在一个不同的目录下创建函数库,为解决这一问题,我们用括号将这两个命令括起来,从而确保它们只被一个单独的shell处理。
第二个方法是,在原来的makefile文件中添加一些宏。新添加的宏通过在我们已见过的宏的尾部追加一个字母得到,字母D代表目录,字母F代表文件名。然后你就可以用下面的规则来替换内置的.c.o后缀规则:
.c.o:
$(CC) $(CLAGS) -C $(@D)/$(<F) -O $(@D)/$(@F)
这条规则的作用是:编译子目录中的源文件并将目标文件放在该子目录中。然后,你用如下的依赖关系和规则来更新当前目录下的函数库:
mylib.a: mydir/2.o mydir3/3.o
ar -rv mylib.a $?
许多项目避免使用子目录,但这将导致在主目录中存在大量的源文件。可以从上面的简介中看到,你只需要为makefile文件稍微增加一点复杂性,即可在make命令中使用子目录。