为什么Makefile include应该是:target?

为什么Makefile include应该是:target?,makefile,Makefile,我一直在使用Makefile,为了将一些东西分开,我决定包含一个新的通用Makefile。我面临的问题是,我的第一个makefile如下所示: 文件名Makefile.test include ./Makefile.a all: a b c b: @echo "b" c: @echo "c" 文件名Makefile.a a: @echo "a" 当我执行makefile:make-f makefile.test时,我只得到一个打印出来的文件,它就完成了 使其工作的唯一

我一直在使用Makefile,为了将一些东西分开,我决定包含一个新的通用Makefile。我面临的问题是,我的第一个makefile如下所示:

文件名Makefile.test

include ./Makefile.a
all: a b c
b:
    @echo "b"
c:
    @echo "c"
文件名Makefile.a

a:
    @echo "a"
当我执行makefile:make-f makefile.test时,我只得到一个打印出来的文件,它就完成了

使其工作的唯一方法是将include bellow放置在all:target的任何位置

这是为什么会这样

谢谢

当你这么说的时候:

include ./Makefile.a
make只是将Makefile.a拉入当前Makefile,方法与C中的include相同:它插入Makefile.a的内容以替换include语句并继续。结果是make在开始思考该做什么时看到了这一点:

a:
    @echo "a"
all: a b c
b:
    @echo "b"
c:
    @echo "c"
因此,源代码顺序中的第一个目标将是,由于您没有指定目标,make将使用第一个目标。这就是你的结果的来源

如果需要,可以显式指定all目标:

make -f Makefile.test all
这将使用all目标,而不管它出现在Makefile中的什么位置

如果您使用的是GNU Make,那么您可以使用在Makefile.test中指定默认目标,这样您就不必担心顺序:

include ./Makefile.a
all: a b c
b:
    @echo "b"
c:
    @echo "c"

.DEFAULT_GOAL := all

感谢提醒。

如果使用GNU make,还可以通过设置覆盖Makefile.test中的默认目标。默认目标:=全部。@Idelic:谢谢提醒,我已经做了一些重要的make工作了。