如何在Makefile中包含干净的目标?

nev*_*int 22 unix makefile

我有一个看起来像这样的Makefile

CXX = g++ -O2 -Wall

all: code1 code2

code1: code1.cc utilities.cc
   $(CXX) $^ -o $@

code2: code2.cc utilities.cc
   $(CXX) $^ -o $@
Run Code Online (Sandbox Code Playgroud)

我接下来想要做的就是包含clean target所以每次运行make它都会自动删除现有的二进制文件,code1code2在创建新文件之前.

我试图将这些行放在makefile的最后,但它不起作用

clean: 
    rm -f $@
    echo Clean done
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

unw*_*ind 35

最好的事情可能是创建一个包含二进制文件的变量:

binaries=code1 code2
Run Code Online (Sandbox Code Playgroud)

然后在all-target中使用它,以避免重复:

all: clean $(binaries)
Run Code Online (Sandbox Code Playgroud)

现在,你也可以在clean-target中使用它,只需添加一些globs来捕获目标文件和东西:

.PHONY: clean

clean:
    rm -f $(binaries) *.o
Run Code Online (Sandbox Code Playgroud)

注意使用.PHONYmake来制作clean一个伪目标.这是一个GNU make功能,因此如果您需要可移植到其他make实现,请不要使用它.

  • 对于`.PHONY`来说是+1(这是一个GNU-ism,但在其他地方却非常无害).但是,把`clean`作为'all`的依赖是个坏主意.这会增加构建时间和噪音.最好定义所有*real*依赖项,以便对源的更改完全根据需要进行传播. (9认同)

qrd*_*rdl 19

在makefile语言中$@表示"目标名称",因此rm -f $@转换为rm -f clean.

您需要指定rm要删除的内容,例如rm -f *.o code1 code2