問題來源
因為筆者想用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!!!