makefile重建,即使它是最新的

时间:2019-10-31 10:11:04

标签: c makefile

我的makefile总是重建,不明白为什么。

这里是:

SRC =   $(DIR)/my_getnbr.c \
        $(DIR)/my_isneg.c \
        $(DIR)/my_putchar.c \

OBJ =   $(SRC:.c=.o)

DIR =   lib/my

LIB_DIR =   lib

NAME    =   libmy.a

MYH =   include/my.h

BUILD = ar rcs $(NAME) $(DIR)/*.o

MV =    mv $(NAME) $(LIB_DIR)

CP =    cp $(MYH) $(DIR)

all:    $(NAME)

$(NAME):    $(OBJ)
            $(BUILD)
            $(MV)
            $(CP)

clean:
    rm -f $(OBJ)

fclean:clean
    rm -f $(LIB_DIR)/$(NAME)

re: fclean all

.PHONY: fclean all re clean

我添加了.PHONY,但它改变了所有内容:(

他总是打BUILD, MV and CP电话。 如果我从Makefile中删除它们,如果他是最新的(仅使用.OBJ),它将不会重建。 再次感谢。

1 个答案:

答案 0 :(得分:5)

您正在将libmy.a移至目录lib。下次运行make时,它将寻找libmy.a,由于它不存在,它将被构建。

make将始终在当前目录中寻找目标(在您的情况下为libmy.a)。因此,如果将文件移到另一个位置,make会认为该文件尚未创建。

经验法则是:目标的配方应始终创建目标所命名的文件。

可能的解决方案:

  • 不移动文件
  • 使用目录(NAME = lib/libmy.a)来限定目标名称(在您的情况下可能最简单)
  • 创建一个虚拟文件代替移动的文件,以便使make查看文件是否存在。但这很复杂,如果做得不好,容易产生误会。