【问题标题】:Echo make my Makefile relink on every MakeEcho 使我的 Makefile 在每个 Make 上重新链接
【发布时间】:2021-11-11 13:43:58
【问题描述】:

我正在制作一个可以在我的大多数学校项目中使用的 Makefile。

我之前只做过基础的makefile,从来没有遇到过问题,但是对于这个我想放一些颜色等等...... 每次我制作它时它都会重新链接。

我认为重新链接来自我的回声?但我不确定。
这是我的生成文件:
#GENERAL
CC = clang++
FLAGS = -Wall -Wextra -Werror -std=c++98
RM = rm -rf

#PROJET
EXEC = ClapTrap

#FILES
SRCS = ClapTrap.cpp main.cpp
OBJS = $(SRCS:.cpp=.o)
OBJSDIR = objects/

#REGLES
.cpp.o: $(SRCS)
    mkdir -p $(OBJSDIR)
    echo "$(BLUE)Compiling $^ ..$(CLEAR)"
    $(CC) $(FLAGS) -c $< -o $(addprefix $(OBJSDIR), $@)
    echo "   $(YELLOW)$(addprefix $(OBJSDIR), $@)$(CLEAR) [$(GREEN)OK$(CLEAR)]"

all: $(EXEC)

$(EXEC): $(OBJS)
    echo "$(BLUE)========================================$(CLEAR)"
    echo "$(BLUE)       Compiling binary file ..$(CLEAR)"
    echo "$(BLUE)========================================$(CLEAR)"
    $(CC) -o $(EXEC) $(addprefix $(OBJSDIR), $^) $(FLAGS)
    echo "$(YELLOW)$(EXEC)$(GREEN) is now ready to use !$(CLEAR)"

clean:
    @$(RM) $(OBJSDIR)
    @echo "$(RED)Cleaning up..$(CLEAR)"

fclean: clean
    @$(RM) $(EXEC)
    @echo -n "$(RED)$(EXEC)$(CLEAR)"

re: fclean all

.PHONY: all

感谢阅读!

编辑:

所以我从我的 .cpp.o 规则依赖项中删除了 SRCS,但仍然重新链接。 这里是更新的 Makefile :

#FILES
SRCS = ClapTrap.cpp main.cpp
OBJS = $(SRCS:.cpp=.o)
OBJSDIR = objects

#REGLES
.cpp.o:
    echo "$(BLUE)Compiling $(YELLOW)$^$(BLUE) ..$(CLEAR)"
    mkdir -p $(OBJSDIR)
    $(CC) $(FLAGS) -c $< -o $@
    mv $@ $(OBJSDIR)
    echo "$(BLUE) - $(YELLOW)$@$(CLEAR) [$(GREEN)OK$(CLEAR)]"

all: $(EXEC)

$(EXEC): $(OBJS)
    echo "$(BLUE)========================================$(CLEAR)"
    echo "$(BLUE)       Compiling binary file ..$(CLEAR)"
    echo "$(BLUE)========================================$(CLEAR)"
    $(CC) $(FLAGS) $(STD) $(addprefix $(OBJSDIR)/, $(OBJS)) -o $(EXEC)
    echo "$(YELLOW)$(EXEC)$(GREEN) is now ready to use !$(CLEAR)"

【问题讨论】:

  • $(EXEC) 的先决条件是$(OBJS),它不包含您的OBJSDIR 前缀(并且还转换x.cpp -&gt; x.o)。由于这些可能不存在,因此该规则将始终过时。此外,您的 .cpp.o: 规则可能应该类似于 $(OBJSDIR)/%.cpp.o: 或类似的。
  • 这是错误的:.cpp.o: $(SRCS)。在后缀规则上包含先决条件列表是不合法的:通过添加先决条件,您将其更改为构建名为 .cpp.o 的目标的普通规则。即使列出先决条件是合法的,这也是错误的:这表示“每个 .o 文件都依赖于 all $(SRCS) 文件”,因此如果任何一个源文件发生更改,则比所有目标文件更改被认为是过时的,并被重建。
  • 嗨,谢谢你的回答!我删除了对我的 .cpp.o 规则的来源的依赖,但我仍然重新链接,我编辑帖子以显示修改。也尝试了 $(OBJSDIR)/.cpp.o: 规则,但叮当声告诉我“没有输入文件”。

标签: c++ makefile


【解决方案1】:

这是错误的:

$(CC) $(FLAGS) -c $< -o $@
mv $@ $(OBJSDIR)

当 make 运行你的配方时,它会将它期望你构建的文件放入 $@ 自动变量中。如果您的 makefile 构建了一些 OTHER 文件,而不是它要求您构建的文件,那么下次运行 make 它会看到它想要的文件不存在(因为您没有构建它,所以您构建了一些 other 文件),所以它总是过时的。

您的规则必须始终准确构建文件 $@,而不是其他文件。

实际上不可能使用suffix rules 编写将目标放在不同目录中的makefile。他们只能在同一目录中创建文件。这就是为什么 GNU make 支持更灵活的 pattern rules 的原因之一。

如果您必须编写一个不支持模式规则的符合 POSIX 的 makefile,并且您想将目标文件放在其他目录中,您所能做的就是明确写出所有目标及其规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多