gpt4 book ai didi

c++ - Makefile 在变量中不获取依赖项

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:50 25 4
gpt4 key购买 nike

我有一个像这样的文件结构

/ 
|- 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 任务添加回显并打印出 $(OBJS) 时,它会打印出我分配给它的所有库,但 make 不会触发构建它们。

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

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

提前致谢!

问候克里斯

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

最佳答案

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

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

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

当你可以这样写的时候:

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

它工作正常吗?

关于c++ - Makefile 在变量中不获取依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com