生成文件在变量中时不选取依赖项

Makefile not picking up dependencies when in variable

本文关键字:选取 依赖 文件 变量      更新时间:2023-10-16

我有一个文件结构,比如

/ 
|- Makefile
|- libs
|- lib1
|- lib2
|- src
|- file.cpp

我有一个顶级的制作文件,它在每个子目录中都包含一个 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 任务添加回显并打印出$(OBJS)它会打印出我分配给它的所有库,但 make 不会触发构建它们。

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

我认为这可能与.二次扩展,但它不应该,因为我没有使用任何延迟变量。

提前感谢!

问候 克里斯

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

你不能这样做。 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

并且工作正常吗?

除了疯狂科学家已经说过的,

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

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

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