避免 gnu make 自动删除文件

jda*_*nay 2 makefile

GNU make 会自动删除我的目标文件。我不明白为什么......我的目标是生成小型测试程序,因此每个源文件都是一个独立的程序,不使用其他模块。

我的生成文件是:

# This makefile is written for Windows cmd shell
SHELL=C:\Windows\System32\cmd.exe

# FILES
SRCS=$(wildcard src/*.cpp)
BINS=$(patsubst %.cpp,bin/%.exe,$(notdir $(SRCS)))

all:compile

obj/%.o:src/%.cpp
    g++ -Wall -Wextra -std=gnu++11 -m64 -D_WIN32_WINNT=0x0400 -c -o $@ $<

bin/%.exe:obj/%.o
    g++ -Wall -Wextra -std=gnu++11 -m64 $^ -o $@

clean:
    if exist obj\*.o del /Q obj\*.o

mrproper:clean
    if exist bin\*.exe del /Q bin\*.exe

compile:$(BINS)

rebuild:clean all

.PHONY:all compile clean mrproper rebuild
Run Code Online (Sandbox Code Playgroud)

例如,使用单个源文件运行 GNU make 的操作如下:

g++ -Wall -Wextra -std=gnu++11 -m64 -D_WIN32_WINNT=0x0400 -c -o obj/Tester.o src/Tester.cpp
g++ -Wall -Wextra -std=gnu++11 -m64 obj/Tester.o -o bin/Tester.exe
rm obj/Tester.o
Run Code Online (Sandbox Code Playgroud)

为什么我的目标文件被删除?如何避免呢?

如果我替换obj/%.o:src/%.cppobj/Tester.o:src/Tester.cppbin/%.exe:obj/%.obin/Tester.exe:obj/Tester.o文件 Tester.o 不会被删除,但这不是我需要的。

小智 5

由于您使用隐式规则(例如\xe2\x80\x98%.o\xe2\x80\x99),目标文件将在make后被删除。

\n\n

添加特殊目标.PRECIOUS来保护它。

\n\n
.PRECIOUS: obj/%.o\n
Run Code Online (Sandbox Code Playgroud)\n\n

参考:

\n\n

特殊的内置目标名称

\n\n

隐含规则链

\n

  • 使用“.PRECIOUS”来保留中间文件不是一个好主意。这可能会导致问题:例如,如果 make 被终止(这将导致编译器被终止)并且目标文件被写了一半并且已损坏,那么 make 不会为您清理它,因为它是“.PRECIOUS”。这不是“.PRECIOUS”的设计目的,并且有更好的方法来避免中间文件。IMO 这不应该被标记为正确答案。 (2认同)
  • _隐式规则_涵盖后缀规则和模式规则:两者都被视为“隐式”,因为两者都没有列出显式目标。 (2认同)