一个简单的例子,两个主程序(prog_x.c和prog_y.c)依赖同一个库文件(myfuns.c),但编译时需要对myfuns.c使用不同的条件编译。比如,编译myfuns.c给prog_x.c用时,需要定义一个宏 FLAG_FOR_X,而编译myfuns.c给prog_y.c用时不需要这个宏。即两个函数所需的编译方式分别是:
cc myfuns.c -DFLAG_FOR_X -c cc myfuns.c -c
这样编出来的两个myfuns.o是不同的,跟两个主函数连接时也是不能通用的。但Makefile检查myfuns.o的时候是不知道所用的编译条件的,只要myfuns.o足够新,Make的时候就不会重编它。这样当我们 make prog_x 接着 make prog_y 时就会把prog_y连接到用FLAG_FOR_X编出来的myfuns.o上面去,因为Make懒得替你重新编一遍myfuns.o 。而我们希望每次编译时都把myfuns重编一次。这可以通过定义一个伪目标实现。示范如下:
EXEC=prog_x prog_y $(EXEC): myfuns.o prog_x: CFLAGS=-DFLAG_FOR_X myfuns.o: ALWAYSMAKE ALWAYSMAKE:
这里在prog_x后定义了只适用于prog_x及其dependency的CFLAGS。当为prog_x编译myfuns.o时就会用则个CFLAGS。我们定义了一个什么都不用做的伪目标ALWAYSMAKE,并且让myfuns.o依赖于这个伪目标。这样每次编译时因为ALWAYSMAKE不存在,所以总需要更新,接着就更新到myfuns上了。
最新评论
6 周 4 天 前
6 周 5 天 前
10 周 6 天 前
15 周 6 天 前
26 周 19 小时 前
45 周 1 天 前
1 年 5 周 前
1 年 5 周 前
1 年 13 周 前
1 年 14 周 前