我有一个像
这样的文件结构/
|- 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
答案 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)