gpt4 book ai didi

c++ - 为什么这个makefile在 'make clean'上执行一个目标

转载 作者:IT老高 更新时间:2023-10-28 22:33:26 24 4
gpt4 key购买 nike

这是我当前的 makefile。

CXX      = g++
CXXFLAGS = -Wall -O3
LDFLAGS =

TARGET = testcpp
SRCS = main.cpp object.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)


.PHONY: clean all

all: $(TARGET)

$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)

.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@

%.d: %.cpp
$(CXX) -M $(CXXFLAGS) $< > $@

clean:
rm -f $(OBJS) $(DEPS) $(TARGET)

-include $(DEPS)

它完美地工作,但有一个异常(exception)。如果目录已经是干净的(没有 *.d、*.o)并且我运行“make clean”,它会重新创建依赖项,然后立即删除它们:

[user@server proj]$ make
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
g++ -Wall -O3 -c main.cpp -o main.o
g++ -Wall -O3 -c object.cpp -o object.o
g++ -Wall -O3 -c foo.cpp -o foo.o
g++ -Wall -O3 main.o object.o foo.o -o testcpp
[user@server proj]$ make clean
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[user@server proj]$ make clean
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[user@server proj]$

我不明白为什么第二个“make clean”会重新生成依赖文件。我怎样才能避免这种情况?对于这个人为的示例来说,这没什么大不了的,但对于一个大型项目来说,这可能非常耗时。

谢谢。

最佳答案

这是因为 .d 文件被无条件地-included。据 make 所知,他们可以将依赖项或命令添加到 clean 目标。出于这个原因,所有 included 文件都会首先构建,否则您可能会得到不正确或失败的构建。要禁用此功能,您需要有条件地包含依赖文件:

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

另一种解决方案是使用 touch 生成依赖文件,并将它们替换为实际数据作为编译的副作用。这就是 automake 进行依赖跟踪的方式,因为它使一次性构建更快。如果您想走这条路,请查看 gcc-MD-MMD 选项。使用如下模式规则:

%.d:
@touch $@

最初创建依赖文件。

关于c++ - 为什么这个makefile在 'make clean'上执行一个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714041/

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