这次只有一个main.cpp和一个Makefile文件。
main.cpp
- #include <iostream>
- using namespace std;
- int main()
- {
- cout<<"hello world!"<<endl;
- return 0;
- }
Makefile
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
我们可以把Makefile这样写:
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
- clean:
- rm *.o
为了执行这条规则,我们可以这样make clean,这样就可以删除所有的.o结尾的文件。
但是当目录内没有.o结尾的文件时,这条命令将会报错,并停止往下执行。
我们把Makefile修改成这样,做个试验:
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
- clean:
- rm *.o
- echo "clean obj"
多次执行make clean,当目录内已经没有.o结尾的文件时,将会出现下面的错误。
- rm *.o
- rm: cannot remove `*.o': No such file or directory
- make: *** [clean] Error 1
但是这个Makefile中,如果不存在.o文件,竟然会报错,并且终止执行,shit。
我们可以做如下修改:
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
- clean:
- -rm *.o
- rm *.o
- rm: cannot remove `*.o': No such file or directory
- make: [clean] Error 1 (ignored)
- echo "clean obj"
- clean obj
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
- clean:
- -rm -f *.o
- echo "clean obj"
- rm -f *.o
- echo "clean obj"
- clean obj
但是,不要以为这样就万事OK了,我们在目录内添加一个文件,文件名为clean。
我们再执行make clean,结果竟然是:
- make: `clean' is up to date.
怎么办,可以通过Makefile的关键字.PHONY,它显式声明一个目标文件是伪目标,执行该伪目标时,make并不关心该目标文件是否存在,只管执行。
- main:main.o
- g++ -o main main.o
- main.o:main.cpp
- g++ -c -o main.o main.cpp
- .PHONY:clean
- clean:
- -rm -f *.o
- echo "clean obj"
不管.o文件是否存在,make clean的时候,都不会报错。