埋线减肥的线有几种:Makefile和子目录

来源:百度文库 编辑:偶看新闻 时间:2024/05/03 17:24:27
五、Makefile和子目录
如果你的项目比较大的话,可以考虑将某些文件组成一个库,然后单独存放到一个子目录内。这时,对于makefile有两种处理方法,下面分别介绍。
第一种方法:在子目录中放置一个辅助makefile,然后把这个子目录中的源文件编译成一个程序库,最后将这个库复制到主目录中。上级目录中的主要makefile可以放上一个规则,通过调用辅助makefile来建立该库:
mylib.a:
(cd mylibdirectory;$(MAKE))
这样的话,我们就会总是构建mylib.a,因为冒号右边为空。当make调用该规则构建该库时,它会切换到子目录mylibdirectory中,然后调用一个新的make命令来管理该库。因为调用了一个新的shell来完成此任务,所以使用makefile 的程序不必进行目录切换。不过,被调用的shell是在一个不同的目录中利用该规则构建该库的,所以括弧能确保所有处理都是由一个shell完成的。
第二种方法:在单个makefile中使用更多的宏,不过这些附加的宏需要在目录名上加D并且为文件名加上F。例如,可以用下面的命令来覆盖内建的.c.o后缀规则:
.c.o:
$(CC) $(CFLAGS) -c $(@D)/$(
为在子目录编译文件,并将目标放在子目录中,可以用像下面这样的依赖关系和规则来更新当前目录中的库:
mylib.a: mydir/f1.o mydir/f2.o
ar -rv mylib.a $?
上述两种方法都是可行的,至于使用哪一种,需要根据您的项目的具体情况来决定。
六、GNU make和gcc的有关选项
如果您当前正在使用GNU make 和GNU gcc编译器的话,那么它们还分别有一个额外的选项可以使用,下面分别加以说明。
我们首先介绍用于make程序的-jN 选项。这个选项允许make同时执行N条命令。这样的话,就可以将该项目的多个部分单独进行编译,make将同时调用多个规则。如果具有许多源文件的话,这样做能够节约大量编译时间。
其次,gcc还有一个-MM选项可用,该选项会为make生成一个依赖关系表。在一个含有大量源文件的项目中,很可能每个源文件都包含一组头文件,而头文件有时又会包含其它头文件,这时正确区分依赖关系就比较难了。这时为了防止遗漏,最笨的方法就是让每个源文件依赖于所有头文件,但这显然没有必要;另一方面,如果你遗漏一些依赖关系的话,就根本就无法编译通过。这时,我们就可以用gcc的-MM选项来生成一张依赖关系表,例如:
$ gcc -MM main.c f1.c f2.c
main.o: main.c def1.h
f1.o: f1.c def1.h def2.h
f2.o: f2.c def2.h def3.h
$
这时,Gcc编译器会扫描所有源文件,并生产一张满足makefile格式要求的依赖关系表,我们只须将它保存到一个临时文件内,然后将其插入makefile即可。