在无具有特定生成文件名的目标中生成干净的结果

make clean results in no target with specific makefile name

本文关键字:目标 结果 文件名      更新时间:2023-10-16

我在同一项目目录下有很多makefile。

Makefile_prune:

OBJS    = main.o
SOURCE  = main.cpp
HEADER  =   Division_Euclidean_space.h  Find_diameter.h Find_k_max.h    Householder.h   IO.h    Mean_variance.h Point.h Random_generator.h  Random_kd_forest.h  Tree.h
OUT     =   rkd
CC  = g++
FLAGS   =   -std=c++0x  -O3 -c  -Wall
# -c flag generates object code for separate files
all: $(OBJS)
    $(CC)   $(OBJS) -o $(OUT)
    make clean
# create/compile the individual files >>separately<< 
main.o: main.cpp
    $(CC) $(FLAGS) main.cpp
.PHONY : all
# clean house
clean:
    rm -f $(OBJS)
# do a bit of accounting
count:
    wc $(SOURCE) $(HEADER)

我收到清理错误,如下所示:

samaras@samaras-A15:~/code$ make -f Makefile_prune 
g++ -std=c++0x  -O3 -c  -Wall main.cpp
g++ main.o -o rkd
make clean
make[1]: Entering directory `/home/samaras/paper/rkd_forest/code'
make[1]: *** No rule to make target `clean'.  Stop.
make[1]: Leaving directory `/home/samaras/paper/rkd_forest/code'
make: *** [all] Error 2

然后我可以运行 make -f Makefile_prune clean ,这将执行清理,但我想是单命令,我的意思是,不必按两次回车键。

相关答案:

    "使目标干净"
  1. 结果为"没有使目标'干净'的规则"
  2. gcc 生成文件错误:"没有规则来设定目标..."

想法:

makefile 实际上用于我有一个 C 项目,我只是做了一些更改以适应C++,也许这就是问题所在。

我认为你需要打电话给make -f Makefile_prune clean.

调用make clean时,由于您没有使用 -f 选项,因此它不会调用Makefile_prune。它调用名为"Makefile"的其他文件,该文件可能没有clean目标。

另参考: https://www.gnu.org/software/make/manual/html_node/Makefile-Names.html

如果没有必要,请不要从makefile内部调用make。在这种情况下,您绝对不会:

all: $(OUT) clean
clean : $(OUT)
    rm -f $(OBJS)
$(OUT) : $(OBJS) 
    $(CC) $(OBJS) -o $(OUT)

这肯定会更快,因为您不必掏钱。此外,如果您再次运行make,则不必重新生成rkd。虽然,如果你想每次都重建它,用一些 PHONY 规则替换$(OUT)(例如 clean : buildbuild : $(OBJS)

此外,应PHONY cleancount

.PHONY : all clean count

最后,有一件事值得指出。您不必手动删除*.o文件。 make应该为您删除它们。请参阅链式规则。