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