Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何在Makefile中包含干净的目标?_Unix_Makefile - Fatal编程技术网

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

Unix 如何在Makefile中包含干净的目标?,unix,makefile,Unix,Makefile,我有一个像这样的Makefile CXX = g++ -O2 -Wall all: code1 code2 code1: code1.cc utilities.cc $(CXX) $^ -o $@ code2: code2.cc utilities.cc $(CXX) $^ -o $@ 我接下来要做的是包括clean target,以便每次 我运行make它会在创建新的二进制文件之前自动删除code1和code2的现有二进制文件 我试图将这些行放在makefile的最末尾,但

我有一个像这样的Makefile

CXX = g++ -O2 -Wall

all: code1 code2

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

code2: code2.cc utilities.cc
   $(CXX) $^ -o $@
我接下来要做的是包括
clean target
,以便每次 我运行
make
它会在创建新的二进制文件之前自动删除
code1
code2
的现有二进制文件

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

clean: 
    rm -f $@
    echo Clean done

正确的方法是什么?

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


您需要为
rm
指定要删除的内容,例如
rm-f*.o code1 code2
最好的方法可能是创建一个保存二进制文件的变量:

binaries=code1 code2
然后在
all
-目标中使用该选项,以避免重复:

all: clean $(binaries)
现在,您也可以将其与
clean
-目标一起使用,只需添加一些glob来捕获对象文件和内容:

.PHONY: clean

clean:
    rm -f $(binaries) *.o

注意使用
.PHONY
使
干净。这是GNU make功能,因此如果您需要移植到其他make实现,请不要使用它。

通过编写它的方式,只有在显式调用clean rule时才会调用它:

澄清

我认为这比每次都打扫干净要好。如果您想按自己的方式执行此操作,请尝试以下方法:

CXX = g++ -O2 -Wall all: clean code1 code2 code1: code1.cc utilities.cc $(CXX) $^ -o $@ code2: code2.cc utilities.cc $(CXX) $^ -o $@ clean: rm ... echo Clean done CXX=g++-O2-壁 全部:清洁代码1代码2 代码1:code1.cc utilities.cc $(CXX)$^-o$@ 代码2:code2.cc utilities.cc $(CXX)$^-o$@ 清洁: rm。。。 回声清洁完成
正如qrdl所解释的,这是错误的。“rm-f$@”变为“rm-f clean”,这不起作用。没有否决票,但通常这是个坏主意。除了一个非常小的项目,任何东西都需要一段时间从头开始构建,你真的不想每次做一个小的更改都要等那么长时间。比亚凯夫:对,我刚才回答了自动删除部分。托马斯·帕德隆·麦卡锡:同意,这写在我的帖子里。除了这不起作用之外,Makefiles的目标和优势之一是你只需要重新编译你真正需要重新编译的东西,而不是整个项目。每次清理都会夺走您的这一功能。此外,您无法保证“清理”会在“代码1”和“代码2”之前执行,因为“所有”的依赖项中没有排序。+1对于
.PHONY
(这是GNU ism,但在其他地方基本无害)。然而,把
清理
作为
all
的依赖项是一个坏主意;这会增加构建时间和噪声。最好定义所有真正的依赖项,以便尽可能精确地传播对源代码的更改。