比如说,在一个目录下,我有很多个.cpp文件,每一个.cpp文件代表着一个独立的程序,那么我们怎么去编写Makefile,使该目录下的.cpp能全部编译成可执行文件呢。
如下:
src=$(wildcard *.cpp)
obj=$(patsubst %.cpp, %, $(src))
ALL:$(obj)
%:%.cpp
g++ $< -o $@
clean:
-rm -rf $(obj)
.PHONY:clean ALL
主要是上面第二、第三行:
obj=$(patsubst %.cpp, %, $(src)) 表示:匹配该目录下全部的.cpp文件去掉后缀后,文件名链接到%符号上。
ALL:$(obj) 表示:将所有的文件名去掉后缀作为目标,所以Makefile的终极目标是可以有多个的。
%:%.cpp 表示:每个目标所用到依赖文件,即每个.cpp源文件。
g++ $< -o %@:则是具体的编译命令了,$<表示的依赖项,$@表示的是最终生成的目标。