问题来源
因为笔者想用GCC编译器进行Windows下的C语言编程,安装了Mingw-w64的x86_64-posix-seh版本,并按照Visual Studio Code官方的教程,将Mingw-w64的bin目录正确添加到了环境变量path中,cmd下可调用gcc、gdb等指令。
后来又遇到多文件编译问题,笔者百度之后发现Mingw-w64自带了make工具。不过这个make工具的名字是mingw32-make.exe(bin目录下)。于是,笔者按照网上的做法,将其复制到同一目录下并改名为make.exe。由于bin目录已经添加到环境变量中,这样操作之后,cmd下就可以直接使用make指令了。
笔者使用Visual Studio Code作为代码编辑器,并直接在Terminal窗口中敲命令编译、运行程序,一切正常。花了好大力气入门了makefile文件的编写之后,笔者调用make指令,也能正确链接编译,得到正确的程序。
然而,当笔者敲下make clean删除.o文件时,Terminal提示错误:系统找不到指定文件。
这是笔者拙劣的makefile代码:
main.exe : main.o func.o gcc main.o func.o -o main.exe main.o : main.c hstd.h gcc -c main.c func.o : func.c hstd.h gcc -c func.c clean : rm main.exe,main.o,func.o
这段代码没有明显的语法语义错误,完全符合makefile的规则和Windows下Powershell的语法规则,可问题确实存在。以管理员身份运行Powershell之后,问题依然没有解决。
解决之路
在bing和百度上搜索这个问题,花了大半天的时间,不论是在csdn还是博客园抑或是其他小网站上,都没有找到合适的解决方案。
偶然间,笔者注意到一个网站没有尝试过,那就是笔者这边访问速度奇慢无比的Stackoverflow。。。
结果,笔者在Stackoverflow上找到了问题的根源:
原来make.exe使用的不是Powershell而是cmd!!!
试验时候发现,cmd下果然默认不能调用rm指令:
Powershell下可以(小技巧:这里rm不加参数直接按回车键可以添加多个要删除的目录/文件,如果不输入任何东西再按一次回车就可以退出rm回到shell):
于是笔者简单修改了makefile文件(就把rm换成cmd下能调用的del):
main.exe : main.o func.o gcc main.o func.o -o main.exe main.o : main.c hstd.h gcc -c main.c func.o : func.c hstd.h gcc -c func.c clean : del main.exe,main.o,func.o
VSCode的Terminal中敲下make clean,没有报错。
还是那句话:make.exe使用的不是Powershell而是cmd!!!