gpt4 book ai didi

c++ - 尝试使用重新分配的变量作为依赖项时,在 make 3.81 中观察到的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 04:27:15 25 4
gpt4 key购买 nike

我在使用 C++ 生成文件时遇到了一个奇怪的问题。我今天下午重写了它,因为我使用的旧版本让我想自杀,而且我遇到了一个关于变量重新分配和动态依赖的奇怪问题。

为了这个问题的目的,假定以下值:

OBJMOD_MODULENAME = obj/lib/foo.o obj/lib/bar.o obj/lib/quux.o
LIBDIR = lib/
CXX = g++
CXXLIBLINK = -shared
LIB = -lm -lpt

我有以下格式的目标:

modulename: OBJ_CURRENTMOD = $(OBJMOD_MODULENAME)
modulename: $(OBJMOD_MODULENAME) lib/metrics.so

及之后的另一种格式:

$(LIBDIR)%.so: $(OBJ_CURRENTMOD)
$(CXX) $(CXXLIBLINK) -o $@ $(OBJ_CURRENTMOD) $(LIB)

代码块中的行总是按照它们在代码块中出现的顺序出现,但是在调试过程中我改变了 block 之间的相对位置。

问题发生在我更改源文件并尝试使用“make modulename”重新编译之后。构建目标文件按预期工作,但如果文件已经存在,则不会重建库,即 $(OBJ_CURRENTMOD) 指定的依赖项将被忽略。在库依赖项中使用 $(OBJMOD_MODULENAME) 会按预期工作。我已经通过多种方式验证了 $(OBJ_CURRENTMOD) 的值符合预期(stick echo
$(OBJ_CURRENTMOD)
例如,在库目标的第一行),但无论我尝试什么,由于依赖性检查,变量似乎都没有及时更新以触发重新编译。

当我输入这个的时候,我找到了一个解决方法:

OBJMOD_MODULENAME = obj/lib/foo.o obj/lib/bar.o obj/lib/quux.o
LIBDIR = lib/
CXX = g++
CXXLIBLINK = -shared
LIB = -lm -lpt

modulename: OBJ_CURRENTMOD = $(OBJMOD_MODULENAME)
modulename: $(OBJMOD_MODULENAME) lib/metrics.so

$(LIBDIR)%.so: herp $(OBJ_CURRENTMOD)
$(CXX) $(CXXLIBLINK) -o $@ $(OBJ_CURRENTMOD) $(LIB)

herp: $(OBJ_CURRENTMOD)

这个虚拟目标在变量引用似乎迫使它更新并解决了我的问题之前加入。这是 make 中的错误还是什么? make --version 表示 GNU make 3.81。其他人可以确认这种奇怪的行为吗?我只是在做一些非常愚蠢的事情吗?我已经盯着它看了好几个小时了,我不会那么惊讶。

编辑:事实证明这并没有真正修复它,它只是每次都让它运行,不管它是否需要它。

验证更改后的值:

$(LIBDIR)%.so: $(OBJ_CURRENTMOD)
echo $(OBJ_CURRENTMOD)
$(CXX) $(CXXLIBLINK) -o $@ $(OBJ_CURRENTMOD) $(LIB)

最佳答案

正如我在其中一条评论中所说,我看不到 $(LIBDIR)%.so 模式如何匹配 modulename 的任何先决条件,但是假设 metrics.solib/metrics.so 那么它将用于构建 lib/metrics.so

正如 interjay 所指出的,“与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。”它们不能被使用在目标模式或先决条件列表中,这解释了为什么当 $(OBJ_MODULENAME) 中的先决条件之一发生更改时目标不会重建。

要使 $(OBJ_CURRENTMOD) 在先决条件列表中有效,您需要使用 secondary expansion

.SECONDEXPANSION:$(LIBDIR)%.so: $$(OBJ_CURRENTMOD)        $(CXX) $(CXXLIBLINK) -o $@ $(OBJ_CURRENTMOD) $(LIB)

关于c++ - 尝试使用重新分配的变量作为依赖项时,在 make 3.81 中观察到的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078902/

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