windows 下 make clean 失败

use*_*881 5 c mingw makefile

我想使用mingw来编译我的C语言项目。

我发现命令make all成功了,但是make clean失败了。我的测试项目中只有两个文件:test.cMakefile.mak.

test.c

#include <stdio.h>

int main()
{
    printf("Hello world\n");
    while (1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Makefile.mak

all: test.o
    gcc test.o -o test.exe

test.o: test.c
    gcc -c test.c

clean:
    @echo "clean project"
    -rm test *.o
    @echo "clean completed"
.PHONY: clean
Run Code Online (Sandbox Code Playgroud)

当我运行时make all -f Makefile.mak,它成功并生成了预期的结果test.exe,而且我也可以运行可执行文件。但是,当我运行时make clean -f Makefile.mak,它失败了,错误是:

"clean project"
rm test *.o
process_begin: CreateProcess(NULL, rm test *.o, ...) failed.
make (e=2):
Makefile.mak:8: recipe for target 'clean' failed
make: [clean] Error 2 (ignored)
"clean completed"
Run Code Online (Sandbox Code Playgroud)

为什么?

编辑:

以下链接启发了我: MinGW makefile with or without MSYS (del vs rm)

  1. 我在我的以下链接中添加了上面链接中提到的解决方法代码makefile
ifeq ($(OS),Windows_NT) 
RM = del /Q /F
CP = copy /Y
ifdef ComSpec
SHELL := $(ComSpec)
endif
ifdef COMSPEC
SHELL := $(COMSPEC)
endif
else
RM = rm -rf
CP = cp -f
endif

all: test.o
    gcc test.o -o test.exe

test.o: test.c
    gcc -c test.c

clean:
    @echo "clean project"
    -$(RM) test.exe *.o
    @echo "clean completed"
.PHONY: clean
Run Code Online (Sandbox Code Playgroud)

有用:

"clean project"
del /Q /F test.exe *.o
"clean completed"
Run Code Online (Sandbox Code Playgroud)
  1. 这提醒我,可能是因为当前环境不支持rm命令,所以我将msys安装路径添加到环境路径中,然后它就可以工作:
clean project
rm test.exe *.o
clean completed
Run Code Online (Sandbox Code Playgroud)

小智 5

试试这个:

“清理干净”不起作用

MinGW 中的 Clean 默认情况下会运行 -rm 命令。但windows不支持该命令。窗口使用del。

所以需要用notepad++编辑makefile,更改

clean:
    -rm -fR $(BUILD_DIR)
Run Code Online (Sandbox Code Playgroud)

clean:
    -del -fR $(BUILD_DIR)
Run Code Online (Sandbox Code Playgroud)


dbu*_*ush 0

您正在尝试删除名为“test”的文件,但不存在此类文件。结果,rm命令失败。

您想要删除“test.exe”,因为这是输出文件的名称。另外,您应该使用-f选项rm,因为这将 1) 强制删除,2) 如果文件不存在也不会失败:

clean:
    @echo "clean project"
    -rm -f test.exe *.o
    @echo "clean completed"
Run Code Online (Sandbox Code Playgroud)