gpt4 book ai didi

c++ - 在 makefile 中,目录名称是假目标还是 "real"目标?

转载 作者:IT老高 更新时间:2023-10-28 21:55:20 25 4
gpt4 key购买 nike

根据我所阅读的有关 makefile 的内容,虚假目标是与实际文件名不对应的任何目标。我的直觉说,作为目标的目录将被视为与文件相同。

为什么这很重要?我的makefile中有一个目录作为目标。当我将它作为我的主要可执行文件的先决条件时,该可执行文件总是会生成,无论一切是否都是最新的。如果我把它作为先决条件,我的 makefile 足够聪明,可以知道什么时候需要构建,但是我有不知道是否需要创建目录的问题。根据我所读到的关于 make 的内容,任何虚假目标都不能作为先决条件,因为 make 不知道它们是否是最新的,所以它们总是会重建关联的目标。这是我的makefile的摘录。

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS)
@echo "--------------------------------------------";
@echo "$(THIS_DIR) $(MACHINE)";
@echo "Linking Shared Library";
@echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}";
ar -rc $(EXEC_WITH_PATH) $(OBJS);
@echo "--------------------------------------------";


# Make dirs for object code and links
${OBJ_DIR} :
@if [ ! -d ${OBJ_DIR} ]; then \
mkdir ${OBJ_DIR}; \
fi;

那么在这种情况下,${OBJ_DIR} 是目录名还是虚假目标?

最佳答案

编辑:这仅适用于 GNU make - 给定“linux”标签的合理假设。

你的目标是一个真正的目标,而不是一个虚假的目标。问题是,当您将目标放入其中时,输出目录会更新,因此它总是比您的目标更新。这意味着你的目标总是会被构建,因为它的依赖关系已经过时了。

您需要的是 order-only prerequisite .这些先决条件允许你指定如果它不存在则需要构建它,但不需要注意时间戳。也就是说,就仅限订单的先决条件而言,目标不会过时。

你可以这样指定:

$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR}
...

竖线之后的任何内容都是仅订单的先决条件。

您现在可以让您的 OBJ_DIR 目标更简单:

${OBJ_DIR} :
mkdir -p ${OBJ_DIR}

注意:我使用了 ${OBJ_DIR} 语法而不是 $(OBJ_DIR) 因为那是您使用的。仅订单的先决条件不依赖于该语法。

关于c++ - 在 makefile 中,目录名称是假目标还是 "real"目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4248300/

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