Makefile在变量中没有获取依赖项

时间:2014-01-31 00:01:30

标签: c++ makefile gnu-make

我有一个像

这样的文件结构
/ 
 |- Makefile
 |- libs
    |- lib1
    |- lib2
 |- src
    |- file.cpp

我有一个顶级Makefile,其中包含每个子目录中的Rules.mk文件。 src文件规则依赖于lib1和lib2,它们也是由makefile构建的。

现在我有一个目标:

# predefined rule
COMP := gcc -o $@ $< $(FLAGS)

file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o
file.o: file.cpp $(OBJS)
    $(COMP) $(OBJS)

在构建东西时(默认目标是file.o),它抱怨库不在那里。当我向file.o任务添加一个echo并打印出$(OBJS)时,它会打印出我分配给它的所有库,但是make并不触发构建它们。

当我将依赖项中的变量$(OBJS)替换为文件名时,它会触发构建,然后显然找到所需的库。

我认为它可能与.SECONDARYEXPANSION有关,但我不应该使用任何延迟变量。

提前致谢!

问候 克里斯

PS:无论如何项目都在Github上,以下文件包含我正在谈论的规则:https://github.com/janhancic/CHIC/blob/242c0ceee558c2eb4b21fe73e94a9ab5f3fe0b49/src/Rules.mk

2 个答案:

答案 0 :(得分:1)

你不能这样做。 GNU make的文档非常清楚:目标特定的变量仅在里面配方中可用。它们在目标或先决条件列表中不可用。在先决条件列表中,make将扩展$(OBJS)全局变量OBJS的值,如果不存在,则为空字符串;不是特定于目标的变量值。

但是,我不明白你为什么写这个:

file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o

当你可以写下这个:

file.o: libs/lib1/lib1.o libs/lib2/lib2.o

并且工作正常吗?

答案 1 :(得分:0)

除了MadScientist已经说过的话,

COMP := gcc -o $@ $< $(FLAGS)

使用立即赋值,它立即评估右边的表达式,结果基本上是COMP := gcc -o $(FLAGS)。请改为使用延迟分配:

COMP = gcc -o $@ $< $(FLAGS)