gpt4 book ai didi

c++ - Make 每次都编译所有文件,包括未更改的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:14 26 4
gpt4 key购买 nike

不知道为什么Make每次都要重新编译所有的文件,包括没变的文件,要花很长时间。我搜索了 Stack Overflow 并找到了一些解决方案,但仍然无法解决我的问题。

我应该如何更改此 makefile 以便它不会编译所有文件,包括未更改的文件?

这是我的制作文件:

CXX = g++
CXXFLAGS = -g -Wall -O2 -std=c++11
BIN = bin
SRC = src
OBJ = obj
COMPILER = $(BIN)/compiler

LEX_CPP = $(SRC)/lex.cpp
UTIL_CPP = $(SRC)/util.cpp
TOKEN_CPP = $(SRC)/token.cpp
MAIN_CPP = $(SRC)/main.cpp
TEST_CPP = $(SRC)/test.cpp
PARSER_CPP = $(SRC)/parser.cpp
COMPILER_CPP = $(SRC)/compiler.cpp

COMPILER_OBJS = parser.o compiler.o test.o token.o lex.o util.o main.o

dir_guard=@mkdir -p $(OBJ)

compiler: $(COMPILER_OBJS)
$(CXX) $(CXXFLAGS) -o $(COMPILER) $(OBJ)/lex.o $(OBJ)/compiler.o $(OBJ)/parser.o $(OBJ)/test.o $(OBJ)/token.o $(OBJ)/util.o $(OBJ)/main.o

main.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/main.o -c $(MAIN_CPP)
lex.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/lex.o -c $(LEX_CPP)
util.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/util.o -c $(UTIL_CPP)
token.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/token.o -c $(TOKEN_CPP)
test.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/test.o -c $(TEST_CPP)
compiler.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/compiler.o -c $(COMPILER_CPP)
parser.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/parser.o -c $(PARSER_CPP)

clean:
rm $(OBJ)/*.o

我想把所有.o文件放到obj文件夹下,把exe文件放到bin文件夹下。

我的操作系统是 Ubuntu 15.04 并使用 GNU Make 4.0。

感谢任何帮助,提前致谢!

最佳答案

非常清楚:您的 makefile 以各种方式损坏,djgandy 和 Norman Gray 已正确诊断。但是,对于为什么不断重建文件的具体问题,具体答案是:

token.o: 
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/token.o -c $(TOKEN_CPP)

抛开所有其他问题,在这里你告诉make:“如果你想构建一个文件token.o,那么你可以用这个配方来完成”。但配方不构建 token.o,它构建 $(OBJ)/token.o。这是错误的,因为在运行配方后目标 (token.o) 仍然不存在。所以下次你运行 make 时,它​​会说“哦,我需要构建 token.o...哎呀,它不存在所以我想我必须构建它...哦,这是一条可以构建它的规则...`,但实际上仍未构建它。

您的 makefile 违反了 second rule of Makefiles : 每个非 .PHONY 规则都必须使用其目标的确切名称更新文件。

您的规则应始终构建 $@,因为它始终具有通向 make 认为您应该构建的目标的路径。

关于c++ - Make 每次都编译所有文件,包括未更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com