makefile重建,甚至是最新的

问题描述 投票:1回答:1

我的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),它将不会重建。再次感谢。

c makefile
1个回答
3
投票

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

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

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

可能的解决方案:

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