makefile重建,即使它是最新的

Zah*_*idi 2 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
Run Code Online (Sandbox Code Playgroud)

我添加了,.PHONY但是它改变了任何东西:(

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

les*_*ana 5

您正在移动libmy.a到目录lib。下次运行make时会寻找它libmy.a,因为它不存在,它将被构建。

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

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

可能的解决方案:

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